gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:14:30 26 4
gpt4 key购买 nike

目前,我有一个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 "$@"

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

如果使用上述设置,我会注意到。
  • 我的计划cron工作程序定期运行。
  • 但是,wsgi 无法服务于网络流量。

  • 首先,我尝试更改 django\entrypoint.sh
    # start cron
    /usr/sbin/crond -f -l 8


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

    完成上述更改后,
  • 我的计划cron工作程序不再运行。不知道为什么。
  • wsgi可以提供网络流量。


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

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

    最佳答案

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

    关于python - 在单个Docker容器中运行crontab服务和wsgi是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52082682/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com