繁体   English   中英

在单个Docker容器中运行crontab服务和wsgi是否正确

[英]Is it right to run crontab service and wsgi within a single docker container

目前,我有一个Django wsgi来处理网络流量。 (我有一个nginx作为前端将流量转发到wsgi)

现在,我想启动一个crobtab服务,以运行定期后台作业。

这就是我所做的


Django的\\ Dockerfile

FROM python:3.6.4-alpine3.4
...

RUN chmod +x entrypoint.sh

ENTRYPOINT ["sh", "entrypoint.sh"]

CMD /usr/local/bin/gunicorn web.wsgi:application -b django:5000 --log-level=info --error-logfile=/var/log/gunicorn3.err.log

Django的\\ entrypoint.sh

#!/bin/sh

...

python manage.py crontab add

# https://stackoverflow.com/questions/37015624/how-to-run-a-cron-job-inside-a-docker-container
#
# "crond -help" yields:
#
# -f      Foreground
# -b      Background (default)
# -S      Log to syslog (default)
# -l N    Set log level. Most verbose:0, default:8
# -d N    Set log level, log to stderr
# -L FILE Log to FILE
# -c DIR  Cron dir. Default:/var/spool/cron/crontabs

# start cron
/usr/sbin/crond -f -l 8

exec "$@"

泊坞窗,compose.yml

  django:
    build:
      context: ./django
      dockerfile: Dockerfile
    restart: always  
    depends_on:
      - pgbouncer
    expose:
      - "5000"
    volumes:
      - static_data:/app/static

如果使用上述设置,我会注意到。

  1. 我的计划cron工人定期运行。
  2. 但是,wsgi 无法提供网络流量。

首先,我尝试在django\\entrypoint.sh进行更改

# start cron
/usr/sbin/crond -f -l 8

# start cron
/usr/sbin/crond -b -l 8

完成上述更改后,

  1. 我的日程安排cron worker不再运行。 不知道为什么。
  2. wsgi可以服务网络流量。

我可以知道为什么会这样吗? 如何使django容器服务于网络流量并同时运行cron作业?

或者,这不是在Docker中执行此操作的正确方法吗? 我应该使用2个容器?

我会在第二个容器上运行一个完整的容器,在compose文件cron或类似的东西中命名该服务(如果您有多个cron ,则可能更特定于实际的工作)。 每个容器1个过程是通常的做法。 在“ cron”容器中,我什至不通过crond运行它,而我将拥有在主机上使用的任何内容来处理容器的调度。 我会将您的工作从django-cron更改为自定义django-admin命令,因为您将不再使用django应用程序来管理它的运行。 您仍然可以在django上创建第二个容器,而仅使用docker-compose.yml文件command: ["django-admin", "mycommand"]更改CMD command: ["django-admin", "mycommand"] 可能不需要暴露第二个容器上的端口。 作为普通服务调用docker-compose run mycronservice

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM