Swift Vapor 3 PostgreSQL Docker-撰写正确的配置?

当前正在构建一个程序包以使用AWS测试一些devOps配置.使用Swift Vapor3,PostgreSQL 11,Docker构建应用程序.给定我的github Repo,假设您已本地安装了postgresql,并使用了用户名:test,密码:test,则该项目的构建/测试/运行与vapor build vapor test很好.

但是我的api没有连接到我的数据库,并且担心我的配置错误.

version: "3.5"
services:
  api:
    container_name: vapor_it_container
    build:
      context: .
      dockerfile: web.Dockerfile
    image: api:dev
    networks:
      - vapor-it
    environment:
      POSTGRES_PASSWORD: 'test'
      POSTGRES_DB: 'test'
      POSTGRES_USER: 'test'
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
    ports:
      - 8080:8080
    volumes:
      - .:/app
    working_dir: /app
    stdin_open: true
    tty: true
    entrypoint: bash
    restart: always
    depends_on:
      - db

  db:
    container_name: postgres_container
    image: postgres:11.2-alpine
    restart: unless-stopped
    networks:
      - vapor-it
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: test
      POSTGRES_PASSWORD: test
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
      PGDATA: /var/lib/postgresql/data
    volumes:
      - database_data:/var/lib/postgresql/data

  pgadmin:
    container_name: pgadmin_container
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: test@test.com
      PGADMIN_DEFAULT_PASSWORD: admin
    volumes:
      - pgadmin:/root/.pgadmin
    ports:
      - "${PGADMIN_PORT:-5050}:80"
    networks:
      - vapor-it
    restart: unless-stopped

networks:
  vapor-it:
    driver: bridge

volumes:
  database_data:
  pgadmin:
  #  driver: local

另外,在阅读Docker postgres文档时,我在“注意事项”部分遇到了这一点.

If there is no database when postgres starts in a container,then postgres will create the default database for you. While this is the expected behavior of postgres,this means that it will not accept incoming connections during that time. This may cause issues when using automation tools,such as docker-compose,that start several containers simultaneously.07001

我尚未进行这些更改,因为我不确定如何制作该文件或配置的外观.有没有人做过这样的事情,并且在连接Postgresql和使用蒸气作为后端方面有一定的经验?

最佳答案
从理论上讲,行为良好的容器应该能够优雅地处理不运行其依赖项的情况,因为尽管容器调度程序已尽力而为,但容器仍可能来去去去.因此,如果您的应用程序需要一个数据库,但在任何给定时刻该数据库不可用,它应该做出合理的响应.例如,为HTTP请求返回503,或在计划任务延迟后重试.

不过,这只是理论,并不总是适用.在您的情况下,也许您确实只需要Vapor应用程序来等待Postgres可用,在这种情况下,您可以使用包装脚本来轮询数据库,并仅在数据库准备好后才启动主应用程序.

See this suggested wrapper script from the Docker docs:

#!/bin/sh
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$@"

until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd
command: ["./wait-for-postgres.sh","db","vapor-app","run"]

相关文章

最近一直在开发Apworks框架的案例代码,同时也在一起修复Apw...
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。...
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,...
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...