我非常尴尬地问这个问题,因为它似乎是一个非常基本的问题,但不知怎的,我无法在文档中找到答案。
我有一个使用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
但它没有帮助
答案 0 :(得分:3)
使用Docker Compose 2.1语法,您可以指定healthchecks来控制容器启动:
version: '2.1'
services:
application:
depends_on:
database:
condition: service_healthy
查看https://github.com/docker-library/healthcheck/tree/master/postgres以获取用于构建带健康检查的Postgres的Dockerfile示例。
答案 1 :(得分:1)
请查看此doc。
第二个例子非常符合您的需求:
您可以使用ADD
或COPY
创建sh脚本并将其添加到您的应用容器中:
#!/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
中,您正在使用容器的默认命令。
当然"python", "app.py"
部分取决于你如何开始你的应用程序。
Fo Java就是例如"java", "-jar", "my-app.jar"
等。
答案 2 :(得分:0)
启动容器的方式一切正常,但是,您遇到的问题是因为DB和APP容器一个接一个地启动,但是,DB容器需要准备DB,因此,当您的应用容器尝试访问您的数据库容器时,它还没有准备就绪,这就是您收到此错误的原因。
你有2个选择,一个是编辑你的APP Docker文件并添加WAIT 30 - 60秒左右,或者你可以自己启动数据库,等待它准备就绪然后启动你的APP容器