当前,我有一个Django wsgi可以处理网络流量。 (我有一个nginx作为前端将流量转发到wsgi)
现在,我想启动一个crobtab服务,以运行定期的后台作业。
这就是我所做的
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
#!/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 "$@"
django:
build:
context: ./django
dockerfile: Dockerfile
restart: always
depends_on:
- pgbouncer
expose:
- "5000"
volumes:
- static_data:/app/static
如果使用上述设置,我会注意到。
首先,我尝试更改django\entrypoint.sh
# start cron
/usr/sbin/crond -f -l 8
到
# start cron
/usr/sbin/crond -b -l 8
进行上述更改后,
我可以知道为什么会这样吗?如何使我的django
容器提供网络流量并同时运行cron作业?
或者,在Docker中做这样的事情不是正确的方法吗?我应该使用2个容器?</ p>
答案 0 :(得分:1)
我将在第二个容器上运行一个完整的容器,以在撰写文件cron
中命名服务或类似的东西(如果您有多个任务,则可能更特定于实际的工作)。每个容器1个过程是通常的做法。在“ cron”容器中,我什至不通过crond
运行它,而我将拥有在主机上使用的任何内容来处理容器的调度。我会将您的工作从django-cron
更改为自定义django-admin
命令,因为您将不再使用django应用程序来管理它的运行。您仍然可以从Django构建第二个容器,而仅用CMD
文件docker-compose.yml
更改command: ["django-admin", "mycommand"]
。可能不需要暴露第二个容器上的端口。调用为常规服务docker-compose run mycronservice