如何在运行docker之前启动postgres

我非常尴尬地问这个问题,因为它似乎是一个非常基本的问题,但不知何故我无法在文档中find答案。

我有一个使用postgres的django应用程序。 在docker-compose.yaml有以下要求:

 version: "2" services: database: image: postgres:9.5 environment: POSTGRES_DB: ${POSTGRES_DATABASE} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DATA: /var/lib/postgresql/data/pgdata 

当我运行我的docker图像︰ docker run -it --name myapp myimage它不断重复:

 The database is not ready. wait for postgres to start... 

我以分离模式运行postgres: docker run -it -d postgres:9.5但是没有帮助

请看看这个文件 。

第二个例子是exacly你所需要的:

您可以使用ADDCOPY创buildsh脚本并将其添加到应用容器中:

 #!/bin/bash # wait-for-postgres.sh set -e host="$1" shift cmd="$@" until psql -h "$host" -U "postgres" -c '\l'; do >&2 echo "Postgres is unavailable - sleeping" sleep 1 done >&2 echo "Postgres is up - executing command" exec $cmd 

然后你修改你的docker-compose.yaml,像这样:

 version: "2" services: web: build: . ports: - "80:8000" depends_on: - "db" command: ["./wait-for-postgres.sh", "db", "python", "app.py"] db: image: postgres 

command你orerriding你的容器的默认命令。 当然, "python", "app.py"部分取决于你如何启动你的应用程序。 佛Java它会是例如"java", "-jar", "my-app.jar"

使用Docker Compose 2.1语法,您可以指定健康检查来控制容器的启动:

 version: '2.1' services: application: depends_on: database: condition: service_healthy 

查看https://github.com/docker-library/healthcheck/tree/master/postgres获取Dockerfile的示例,用于构build带健康检查的Postgres。

一切都可以用你启动容器的方式,但是,你遇到的问题是因为DB和APP容器是一个接一个地启动的,但是,DB容器需要准备DB,进行迁移和所以,所以,当你的应用程序容器试图到达你的数据库容器时,它没有准备好,所以这就是为什么你得到这个错误。

你有两个select,一个是编辑你的APP Dockerfile并且等待30-60秒左右,或者你可以自己启动数据库,等待它准备好,然后启动你的APP容器。