gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:29:10 25 4
gpt4 key购买 nike

目前正在构建一个程序包以使用 AWS 测试一些开发运营配置。使用 Swift Vapor3、PostgreSQL 11、Docker 构建应用程序。鉴于我的 github Repo该项目构建/测试/运行正常 vapor build vapor test vapor run假设您在本地安装了带有 username: test, password: test 的 postgresql

但是我的 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.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="$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"]

关于postgresql - Swift Vapor 3 + PostgreSQL + Docker-Compose 配置正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55500917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com