在包含 postgres、nginx、celery、redis、elasticsearch 的 django 应用程序的 Docker 容器中处理 RACE CONDITION

Handling RACE CONDITION in Docker containers of a django app which include postgres,nginx,celery,redis,elasticsearch

我是 docker 的新手。我在同时部署多个容器时遇到问题,它正在发生竞争情况。每次我输入 docker-compose up --build 命令时,elasticsearch 或 redis 先启动,然后数据库启动和退出,错误代码为 0 以及 celery 和 nginx。我尝试使用 "sleep" 命令,但没有运气(也许我错过了什么)。这是我的 docker-compose.yml 文件 -

version: "3"

services:
  db:
    image: postgres:9.6-alpine
    container_name: myblogdb
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb
    volumes:
      - myblogdb_data:/var/lib/postgresql/data/
    ports:
      - "4949:5432"

  web:
    build: ./app
    command: sh -c "gunicorn djangoApp.wsgi:application --bind 0.0.0.0:8000"
    volumes:
      - ./app:/usr/src/app/
      - my_blog_static_volume:/usr/src/app/djangoApp/settings/staticfiles
      - my_blog_media_volume:/usr/src/app/mediafiles
    ports:
      - "8000:8000"
    depends_on:
      - db
      - redis
      - es

  nginx:
    restart: always
    build: ./nginx
    volumes:
      - my_blog_static_volume:/usr/src/app/djangoApp/settings/staticfiles
      - my_blog_media_volume:/usr/src/app/mediafiles
    ports:
      - "1337:80"
    depends_on:
      - web


  redis:
    image: "redis:alpine"

  es:
    image: elasticsearch:5.6.15-alpine
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256M -Xmx256M"  
    volumes:
      - my_blog_esdata:/usr/share/elasticsearch/data/
    ports:
      - "9200:9200"

  celery:
    restart: always
    build: ./app
    command: sh -c "celery -A djangoApp worker -l info"
    volumes:
      - ./app:/usr/src/app/
    depends_on:
      - db
      - redis
      - web


  celery-beat:
    restart: always
    build: ./app
    command: sh -c "celery -A djangoApp beat -l info"
    volumes:
      - ./app:/usr/src/app/
    depends_on:
      - db
      - redis
      - web


volumes:
  myblogdb_data:
  my_blog_static_volume:
  my_blog_media_volume:
  my_blog_esdata:

如果我在这里遗漏了什么,请告诉我。谢谢

您需要添加类似 wait-for-it or wait-for in order to control startup and shutdown order in compose 的脚本,它基本上告诉服务在 运行 启动命令之前等待另一个服务。

因此,如果您希望 Django 等待 PostgreSQL,docker-compose 中的 command 将是:

["./wait-for", "db:5432", "--", "gunicorn", "djangoApp.wsgi:application", "--bind", "0.0.0.0:8000"]

下面answer有完整的解释,答案描述了MySQL和Golang,但同样的概念适用于你的案例