【问题标题】:Cron in Docker container parallel with DjangoDocker 容器中的 Cron 与 Django 并行
【发布时间】:2018-04-20 01:14:50
【问题描述】:

我目前正在 Rancher 上的 Docker 组合设置中运行 Django Web 应用程序。因为我希望服务器定期运行 Django 管理命令,所以我为它设置了一个 crontab。

* * * * * root /usr/local/bin/python /usr/src/app/manage.py updatesomething >> /usr/src/app/cron.log 2>&1

我正在使用下面显示的 Dockerfile,如您所见,我尝试使用 CMD ["cron", "-f"] 独立运行 crontab。这可以正常工作并按应有的方式运行命令。 然而,这个想法是它可以在 Web 应用程序上并行运行并触发管理命令。我还验证了 crontab 文件是否存在。

cron.log 文件保持为空超过 10 分钟,因此 cron 显然没有在这里完成它的工作。有没有人可以在python:3 容器中并行运行 cron 的解决方案?主管不是一个真正的选择,因为我有一个 Python 3 代码库。而且我还不能让Circus 使用另一个容器中的数据库。

############################################################
# Dockerfile to run a Django-based web application
# Based on a Python 3 image
############################################################

# Set the base image to use to Python 3
FROM python:3

RUN apt-get update -qq && apt-get install -y -qq --force-yes cron
COPY ./docker/crontab/updatesomething /etc/cron.d/updatesomething
RUN chmod 0644 /etc/cron.d/updatesomething

RUN mkdir -p /usr/src/app /srv/logs
WORKDIR /usr/src/app

# Install dependencies
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt
RUN cron

# Copy application files
COPY . /usr/src/app/

# Port to expose
EXPOSE 8000

# Copy entrypoint script into the image
COPY docker_entrypoint.sh /docker_entrypoint.sh
RUN chmod +x /docker_entrypoint.sh
CMD ["/docker_entrypoint.sh"]

【问题讨论】:

  • 您必须在 docker_entrypoint.sh 中启动 cron。可以为 cron 启动一个独立的容器,为 wsgi Web 服务器启动另一个容器。 RUN 无法启动诸如crond 之类的守护进程。
  • 有关在 docker 中运行 cron 的详细信息,请参阅此问题。 stackoverflow.com/questions/37458287/…
  • @HåkenLid 啊,谢谢,我忽略了RUN 并未在目标机器上实际运行,因此无法启动cron 的部分。我现在还有一些数据库问题,但我想我可以解决这些问题

标签: python django docker cron


【解决方案1】:

如果您想定期运行管理命令,请查看Celery 并使用Celery beat。您可以运行在特定时间调用管理命令的任务,就像使用 cron 一样。 Django 有一种从代码中调用管理命令的方法。您可以从 docker-compose 设置中运行 Celery 和 Celery beat。

from celery import shared_task
from django.core.management import call_command

@shared_task
def management_command_task():
    call_command('my_command', 'foo', bar='baz')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 2017-08-28
    • 2018-12-27
    • 2021-05-06
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多