postgresql - 数据库初始化发生在 docker-compose 中其他服务的启动之后
问题描述
当我第一次构建容器时,数据库没有足够的时间来初始化自己,而 Web 服务和 nginx 已经启动,因此我无法从第一次运行中访问服务器,但在第二次容器运行后一切正常。我试过这个command: ["./wait-for-it.sh", "db:5432", "--", "python", "manage.py runserver 0.0.0.0:8000"]
等到数据库初始化,但它没有帮助我。请帮助我让我的服务等到数据库初始化。我已经尝试过这篇文章的解决方案,但没有任何帮助。请帮助我让我的服务等到数据库初始化。提前致谢!
这是我的docker-compose文件
version: "3.9"
services:
db:
image: postgres:13.3-alpine
container_name: db
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- "5432:5432"
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:5432" ]
interval: 30s
timeout: 10s
retries: 5
web:
build: .
container_name: web
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
restart: on-failure
depends_on:
- db
nginx:
build: ./nginx
container_name: nginx
ports:
- "80:80"
restart: on-failure
depends_on:
- web
- db
解决方案
depends_on
只等到服务启动,而不是等到它是健康的。您应该尝试另外定义条件service_healthy
以等待依赖项健康:
depends_on:
db:
condition: service_healthy
这是一个完整的 docker-compose 文件供参考:
version: "3.9"
services:
db:
image: postgres:13.3-alpine
container_name: db
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 1s
timeout: 5s
retries: 5
web:
image: nginx:latest
container_name: web
restart: on-failure
depends_on:
db:
condition: service_healthy
推荐阅读
- python - Homebrew:使用以前版本的 Python 模块 (v3.9 -> v.3.8)
- c - 有没有一种简单的方法来检查 C (Visual Studio) 中是否存在文件?
- android - 由于找到空索引,Android Room 迁移失败
- c++ - 64 位发布版本给了我一个 GLIBC 重定位错误
- javascript - 带有 React 组件的 Javascript .map(...)
- csv - 即使它们完全相同,比较值也会返回 FALSE - Google App Script
- google-api - 如何为具有离线访问权限的 Google API 生成“client_secret.json”
- kubernetes - 错误未知标志--控制平面端点
- openstack - Swift 容器中的文件数量是否有实际限制?
- postgresql - 在 Postgres 中转置/透视表