django - 如何在Docker Compose中设置 `celeryd`和 `celerybeat`?

标签 django docker celery docker-compose

我有一项每分钟更新一次的任务。

这是我用于Django应用程序的Dockerfile。

FROM python:3-onbuild

COPY ./ /
EXPOSE 8000
RUN pip3 install -r requirements.txt
RUN python3 manage.py collectstatic --noinput

ENTRYPOINT ["python3", "manage.py", "celeryd"]
ENTRYPOINT ["python3", "manage.py", "celerybeat"]
ENTRYPOINT ["/app/start.sh"]

这是我的docker-compose.yml。
version: "3"  
services:  
  nginx:
    image: nginx:latest
    container_name: nginx_airport
    ports:
      - "8080:8080"
    volumes:
      - ./:/app
      - ./nginx:/etc/nginx/conf.d
      - ./static:/app/static
    depends_on:
      - web
  rabbit:
      hostname: rabbit_airport
      image: rabbitmq:latest
      environment:
          - RABBITMQ_DEFAULT_USER=admin
          - RABBITMQ_DEFAULT_PASS=asdasdasd
      ports:
          - "5673:5672"
  web:
    build: ./
    container_name: django_airport
    volumes:
      - ./:/app
      - ./static:/app/static
    expose:
      - "8080"
    links:
        - rabbit
    depends_on:
        - rabbit

这是我正在运行的容器的最前面的日志。
rabbit_1  | =INFO REPORT==== 29-Sep-2017::11:45:30 ===
rabbit_1  | Starting RabbitMQ 3.6.12 on Erlang 19.2.1
rabbit_1  | Copyright (C) 2007-2017 Pivotal Software, Inc.
rabbit_1  | Licensed under the MPL.  See http://www.rabbitmq.com/
rabbit_1  | 
rabbit_1  |               RabbitMQ 3.6.12. Copyright (C) 2007-2017 Pivotal Software, Inc.
rabbit_1  |   ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
rabbit_1  |   ##  ##
rabbit_1  |   ##########  Logs: tty
rabbit_1  |   ######  ##        tty
rabbit_1  |   ##########
rabbit_1  |               Starting broker...
rabbit_1  | 
rabbit_1  | =INFO REPORT==== 29-Sep-2017::11:45:30 ===
rabbit_1  | node           : rabbit@rabbit_airport
rabbit_1  | home dir       : /var/lib/rabbitmq
rabbit_1  | config file(s) : /etc/rabbitmq/rabbitmq.config
rabbit_1  | cookie hash    : grcK4ii6UVUYiLRYxWUffw==
rabbit_1  | log            : tty
rabbit_1  | sasl log       : tty
rabbit_1  | database dir   : /var/lib/rabbitmq/mnesia/rabbit@rabbit_airport
rabbit_1  | 
rabbit_1  | =INFO REPORT==== 29-Sep-2017::11:45:31 ===
rabbit_1  | Memory high watermark set to 3145 MiB (3298503884 bytes) of 7864 MiB (8246259712 bytes) total
rabbit_1  | 
rabbit_1  | =INFO REPORT==== 29-Sep-2017::11:45:31 ===
rabbit_1  | Enabling free disk space monitoring
rabbit_1  | 
rabbit_1  | =INFO REPORT==== 29-Sep-2017::11:45:31 ===
rabbit_1  | Disk free limit set to 50MB
rabbit_1  | 
rabbit_1  | =INFO REPORT==== 29-Sep-2017::11:45:31 ===
rabbit_1  | Limiting to approx 1048476 file handles (943626 sockets)

一切正常,除了我的 celery 任务未运行。

编辑:
#!/bin/bash

# PENDING: From the source here,
# http://tutos.readthedocs.io/en/latest/source/ndg.html it says that it is a
# common practice to have a specific user to handle the webserver.

SCRIPT=$(readlink -f "$0")
DJANGO_SETTINGS_MODULE=airport.settings
DJANGO_WSGI_MODULE=airport.wsgi
NAME="airport"
NUM_WORKERS=3

if [ "$BASEDIR" = "/" ]
then
    BASEDIR=""
else
    BASEDIR=$(dirname "$SCRIPT")
fi

if [ "$BASEDIR" = "/" ]
then
    VENV_BIN="venv/bin"
    SOCKFILE="run/gunicorn.sock"
else
    VENV_BIN=${BASEDIR}"/venv/bin"
    SOCKFILE=${BASEDIR}"/run/gunicorn.sock"
fi

SOCKFILEDIR="$(dirname "$SOCKFILE")"
VENV_ACTIVATE=${VENV_BIN}"/activate"
VENV_GUNICORN=${VENV_BIN}"/gunicorn"

# Activate the virtual environment.
# Only set this for virtual environment.
#cd $BASEDIR
#source $VENV_ACTIVATE

# Set environment variables.
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$PYTHONPATH:$BASEDIR

# Create run directory if they does not exists.
#test -d $SOCKFILEDIR || mkdir -p $SOCKFILEDIR

# Start Gunicorn!
# Programs meant to be run under supervisor should not daemonize themselves
# (do not use --daemon).
#
# Set this for virtual environment.
#exec ${VENV_GUNICORN} ${DJANGO_WSGI_MODULE}:application \
#    --bind=unix:$SOCKFILE \
#    --name $NAME \
#    --workers $NUM_WORKERS

# For non-virtual environment.
exec gunicorn ${DJANGO_WSGI_MODULE}:application \
    --bind=unix:$SOCKFILE \
    --name $NAME \
    --workers $NUM_WORKERS

详细详细详细详细详细详细
详细详细详细详细详细详细
详细详细详细详细详细详细
详细详细详细详细详细详细
详细详细详细详细详细详细
详细详细详细详细详细详细

最佳答案

您的入口点相互覆盖。最后一个入口点是将运行的唯一入口点。您可以尝试构建并运行以下命令以确保。

FROM alpine
ENTRYPOINT ["echo", "1"]
ENTRYPOINT ["echo", "2"]

docker docs中所述。要为每个容器启动多个服务,可以将启动命令包装在包装脚本中,然后在dockerfile中的CMD中运行包装脚本。

包装器
python3 manage.py celeryd
python3 manage.py celerybeat
./app/start.sh
FROM python:3-onbuild

COPY ./ /
EXPOSE 8000
RUN pip3 install -r requirements.txt
RUN python3 manage.py collectstatic --noinput
ADD wrapper.sh wrapper.sh
CMD ./wrapper.sh

关于django - 如何在Docker Compose中设置 `celeryd`和 `celerybeat`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46489088/

相关文章:

python celry + amazon EC2 由于散列而失败

python - Django/Postgres 将使用多少字节作为十进制字段?

node.js - Docker 容器中的 Node http-proxy

Docker.IO 文件系统一致性

exception - 导入错误 : No module named exceptions

python - Celery、RabbitMQ、Redis : Celery message enters exchange, 但不排队?

Django:可重用应用程序测试的设置?

python - Django查询

python - django 日期字段像星期日星期一一样得到星期几

由于 : "go directory outside available modules",Docker 构建失败