首页 > 解决方案 > 芹菜有时不会在 docker 中运行

问题描述

我一直在为这个而疯狂,我的 docker-compose.yml 中的芹菜服务只是不接受任务(有时)。它有时会起作用

Dockerfile:

FROM python:3.6
RUN apt-get update

RUN mkdir /web_back
WORKDIR /web_back

COPY web/requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt


COPY web/ .

docker-compose.yml (为了便于理解,取出了一些服务)

version: '3'
services:

  web_serv:
    restart: always
    build: .
    container_name: web_back_01
    env_file:
      - ./envs/web_back_01.env
    volumes:
      - ./web/:/web_back
    depends_on:
      - web_postgres
    expose:
      - 8282
    extra_hosts:
      - "dockerhost:104.10.4.11"
    command: bash -c "./initiate.sh"

  service_A:
    restart: always
    build: ../../web-service-A/A/
    container_name: web_back_service_a_01
    volumes:
      - ../../web-service-A/A.:/web-service-A
    depends_on:
      - web
    ports:
      - '5100:5100'
    command: bash -c "python server.py"

  service_B:
    restart: always
    build: ../../web-service-B/B/
    container_name: web_back_service_b_01
    volumes:
      - ../../web-service-B/B.:/web-service-B
    depends_on:
      - web
    ports:
      - '5200:5200'
    command: bash -c "python server.py"

  web_postgres:
    restart: always
    build: ./postgres
    container_name: web_postgres_01
    #    restart: unless-stopped
    ports:
      - "5433:5432"
    environment:   # will be used by the init script
      LC_ALL: C.UTF-8
      POSTGRES_USER: web
      POSTGRES_PASSWORD: web
      POSTGRES_DB: web
    volumes:
      - pgdata:/var/lib/postgresql/data/


  nginx:
    restart: always
    build: ./nginx/
    container_name: web_nginx_01
    volumes:
      - ./nginx/:/etc/nginx/conf.d
      - ./logs/:/code/logs
      - ./web/static/:/static_cdn/
      - ./web/media/:/media_cdn/
    ports:
      - "80:80"
    links:
      - web_serv
  redis:
    restart: always
    container_name: web_redis_01
    ports:
      - "6379:6379"
    links:
      - web_serv
    image: redis
  celery:
    build: .
    volumes:
      - ./web/:/web_back
    container_name: web_celery_01
    command: celery -A web worker -l info
    links:
      - redis
    depends_on:
      - redis
volumes:
  pgdata:
  media:
  static:

设置.py

CELERY_BROKER_URL = 'redis://redis:6379'
CELERY_RESULT_BACKEND = 'redis://redis:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'

注意service_Aand service_B,这两个服务有时不会被启动。任何有助于理解奇怪行为的帮助都会非常有帮助!谢谢

标签: pythondjangodocker-composecelery

解决方案


所以,我我遇到了类似的问题。我正在拔头发,因为我正在更新我的worker.py,然后不仅自动加载不会反映任何更改,而且当我重新运行我docker-compose up的更改时仍然不会反映。

有时,当我运行时,docker-compose up --build --force-recreate我的更改会得到反映,但并不可靠。

我能够通过做两件事来解决这个问题:

  1. 删除__pycache__我的工作人员目录中的。
  2. 当缓存行为持续存在时$ find . -name "*.pyc" -exec rm {} \;,在执行之前运行。docker-compose up --build --force-recreate

我不是 100% 确定自己发生了什么,但很明显 Celery + Docker w/o autoload 意味着 Docker 倾向于使用已编译任务的缓存版本。我看到一些关于如何使用 Celery + Docker 设置自动加载以及 webdog 或 modd 等方法的讨论,但是,我还没有为我的项目设置它。


推荐阅读