Swift Vapor 3 + PostgreSQL + Docker-Compose 配置正确吗?

Swift Vapor 3 + PostgreSQL + Docker-Compose Correct configuration?

目前正在构建一个包来测试一些 AWS 的开发运营配置。使用 Swift Vapor3、PostgreSQL 11、Docker 构建应用程序。考虑到我的 github Repo 项目 builds/tests/runs 与 vapor build vapor test vapor run 相得益彰,因为您在本地安装了 postgresql username: test, password: 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 文档时,我在 "Caveats" 部分中遇到了这个问题。

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.postgres dockerhub

我没有进行这些更改,因为我不确定如何制作该文件或配置的外观。有没有人做过这样的事情,并且有连接到 Postgresql 和使用 vapor 作为后端的经验?

理论上,一个行为良好的容器应该能够优雅地处理没有依赖项的问题 运行,因为尽管您的容器调度程序尽了最大努力,容器仍可能来来去去。因此,如果您的应用程序需要一个数据库,但在任何给定时刻该数据库都不可用,它应该 理性地响应。例如,为 HTTP 请求返回 503,或为计划任务延迟后重试。

不过那是理论,并不总是适用。在你的情况下,也许你真的只需要你的 Vapor 应用程序来等待 Postgres 可用,在这种情况下你可以使用一个包装脚本来轮询你的数据库并且只在数据库准备好后启动你的主应用程序。

See this suggested wrapper script from the Docker docs:

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

set -e

host=""
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"]