如何在Docker中运行cron? (即使使用简单的crontab也没有作业/输出)

时间:2017-12-11 17:56:59

标签: python docker cron dockerfile

我正在尝试将一个cronjob放入我的docker容器中,该容器运行python脚本。

我的Dockerfile:

FROM python:3.6.2
RUN apt-get update && apt-get -y install cron
ADD . /dir
WORKDIR /dir
RUN pip install -r requirements.txt
RUN chmod 0644 /dir
ADD crontab /dir
ENV NAME loader
CMD  cron -f

我的crontab文件:

* * * * * root /loader.py

当我跑:

$ docker run -t -i loader:latest

10分钟后我什么都没得到。该脚本在运行时会写出Hello world。我从docker镜像中删除了cron,脚本工作并写出Hello world

当我试图简化事情的时候,我试图让脚本离开,所以cron只会像每天一样写出像hi这样的东西:

* * * * * root echo "hi"

但没有任何反应。

1 个答案:

答案 0 :(得分:0)

有几个问题。

首先,正如@charlesduffy所提到的,您需要在crontab找到它的cron文件中安装它(例如,/etc/crontab)。出于测试目的,我使用了以下crontab文件:

* * * * * root date > /tmp/flagfile

我使用Dockerfile构建了一个图像,但我添加了一个syslog服务来查看来自cron的日志消息。我的Dockerfile看起来像:

FROM python:3.6.2
RUN apt-get update && apt-get -y install cron busybox
ADD . /dir
WORKDIR /dir
RUN chmod 0644 /dir
COPY crontab /etc/crontab
ENV NAME loader
CMD  busybox syslogd && cron -f

容器运行后,我会在/var/log/messages中看到以下内容:

Dec 11 19:49:54 1d77fad4bf9d cron.info cron[9]: (CRON) INFO (pidfile fd = 3)
Dec 11 19:49:54 1d77fad4bf9d cron.info cron[9]: (*system*) INSECURE MODE (group/other writable) (/etc/crontab)
Dec 11 19:49:54 1d77fad4bf9d cron.info cron[9]: (CRON) INFO (Running @reboot jobs)

看来cron/etc/crontab的权限不满意。我修改了我的Dockerfile来解决这个问题:

FROM python:3.6.2
RUN apt-get update && apt-get -y install cron busybox
ADD . /dir
WORKDIR /dir
RUN chmod 0644 /dir
COPY crontab /etc/crontab
RUN chmod 600 /etc/crontab
ENV NAME loader
CMD  busybox syslogd && cron -f

现在,如果我运行容器,大约一分钟后我会看到/tmp/flagfile出现,而/var/log/messages我看到了:

Dec 11 19:57:16 dda8a21d48a4 cron.info cron[10]: (CRON) INFO (pidfile fd = 3)
Dec 11 19:57:16 dda8a21d48a4 cron.info cron[10]: (CRON) INFO (Running @reboot jobs)
Dec 11 19:58:01 dda8a21d48a4 authpriv.err CRON[71]: pam_env(cron:session): Unable to open env file: /etc/default/locale: No such file or directory
Dec 11 19:58:01 dda8a21d48a4 authpriv.info CRON[71]: pam_unix(cron:session): session opened for user root by (uid=0)
Dec 11 19:58:01 dda8a21d48a4 cron.info CRON[72]: (root) CMD (date > /tmp/flagfile)
Dec 11 19:58:01 dda8a21d48a4 authpriv.info CRON[71]: pam_unix(cron:session): session closed for user root