首页 > 解决方案 > 数据库初始化发生在 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

标签: postgresqldockerdocker-compose

解决方案


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

推荐阅读