如何在运行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你所需要的:
您可以使用ADD
或COPY
创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
一切都可以用你启动容器的方式,但是,你遇到的问题是因为DB和APP容器是一个接一个地启动的,但是,DB容器需要准备DB,进行迁移和所以,所以,当你的应用程序容器试图到达你的数据库容器时,它没有准备好,所以这就是为什么你得到这个错误。
你有两个select,一个是编辑你的APP Dockerfile并且等待30-60秒左右,或者你可以自己启动数据库,等待它准备好,然后启动你的APP容器。
- 如何在Jboss EAP openshift镜像上设置Classpath
- 用最新的jenkins创builddocker图像
- 无法将docker nginx与docker ubuntu连接起来
- 如何在我的Windows命令提示符下运行docker命令?
- Kubernetes的发展环境
- 在Docker上向Apple APNScurlHTTP2请求失败,但在Mac OSX上运行
- on docker image level = error msg =“无法closurestar编写器:io:在closures的pipe道上读/写”
- 无法使用sed在mariadb Dockerfile中自定义缓冲区大小
- 在Dotnet docker容器中运行VSCode