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"]
目前正在构建一个包来测试一些 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"]