Postgresql 如何在运行docker之前启动postgres
我非常不好意思问这个问题,因为这似乎是一个非常基本的问题,但不知何故,我在文档中找不到答案 我有一个使用postgres的django应用程序。在Postgresql 如何在运行docker之前启动postgres,postgresql,docker,docker-compose,Postgresql,Docker,Docker Compose,我非常不好意思问这个问题,因为这似乎是一个非常基本的问题,但不知何故,我在文档中找不到答案 我有一个使用postgres的django应用程序。在docker compose.yaml中有以下要求: version: "2" services: database: image: postgres:9.5 environment: POSTGRES_DB: ${POSTGRES_DATABASE} POSTGRES_USER: ${POSTGRES_USER}
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
但是它没有帮助您启动容器的方式一切正常,但是,您遇到的问题是因为DB和应用程序容器正在一个接一个地启动,但是,DB容器需要准备DB、执行迁移等等,因此,当你的应用程序容器试图到达你的DB容器时,它还没有准备好,这就是为什么你会遇到这个错误
您有两个选择,一个是编辑应用程序Dockerfile并添加等待30-60秒左右,或者您可以自己启动数据库,等待它准备就绪,然后启动应用程序容器。请查看此项 第二个例子正好是您需要的: 您可以使用
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”
部分取决于您如何启动应用程序。
对于Java,它可能是例如
“Java”、“-jar”、“my app.jar”
等。使用Docker Compose 2.1语法,您可以指定控制容器启动:
version: '2.1'
services:
application:
depends_on:
database:
condition: service_healthy
查看示例Dockerfile,以使用healthchecks构建Postgres。但它告诉我找不到角色“我的用户名”。在db:部分我现在有:数据库:图像:postgres:9.5环境:postgres_db:“django_db”postgres_用户:“我的用户名”postgres_密码:“我的密码”我应该以某种方式‘告诉’ti postgres图像创建
我的用户名
用户,对吗?但是怎么做呢?请检查一下。您可以通过设置环境变量(如POSTGRES\u PASSWORD
)来设置管理员凭据。您可以检查如何在docker compose中设置环境变量。