Cron作业不能在Docker容器内自动运行

时间:2016-03-01 11:44:09

标签: linux docker cron

我有一个带主管的LAMP容器。

我添加了一个简单的cron

* * * * * root /bin/date >> /var/log/cron.log

来自我的Dockerfile

ADD ./crons/test /etc/cron.d/test RUN chmod 0777 /etc/cron.d/test

我通过主管用这样的supervisor-cron.conf启动cron:

[program:cron]
command=/bin/bash -c "cron -f"
numprocs=1
autostart=true
autorestart=true
startretries=2

Cron开始很好并保持正常运行。奇怪的是,没有cronjob自动运行[应该如此]但是当我执行docker exec lamp crontab /etc/cron.d/test时,cron作业开始并按预期工作。

我错过了什么吗?在任何地方我都读到cron作业由cron自动执行。

2 个答案:

答案 0 :(得分:5)

我解决了。

我尝试在/ etc / crontab和/etc/cron.d/中设置它们。

Cron没有自动启动cron作业。

然而,当我跑docker exec lamp crontab /etc/cron.d/my_cronjob_file时,一切都很好。这让我很怀疑,然后我读了this。因此,在容器[在dockerfile]中添加my_cronjob_file后,我添加了RUN crontab /etc/cron.d/my_cronjob_file。这基本上将cronjob'安装'到crontab表。 [我不知道cron / tab的内部,但这是我理解的主旨。]

之后,cron服务由主管提出,而cronjob就像魅力一样。

答案 1 :(得分:0)

这个可以通过bash文件解决,由于Docker的分层架构,cron服务不会通过RUN/CMD/ENTRYPOINT命令启动。

只需添加一个 bash 文件即可启动 cron 和其他服务(如果需要)

DockerFile

FROM gradle:6.5.1-jdk11 AS build
# apt
RUN apt-get update
RUN apt-get -y install cron
# Setup cron to run every minute to print (you can add/update your cron here)
RUN touch /var/log/cron-1.log
RUN (crontab -l ; echo "* * * * * echo testing cron.... >> /var/log/cron-1.log 2>&1") | crontab
# entrypoint.sh
RUN chmod +x entrypoint.sh
CMD ["bash","entrypoint.sh"]

entrypoint.sh

#!/bin/sh
service cron start & tail -f /var/log/cron-2.log

如果还需要任何其他服务与 cron 一起运行,请在同一命令中使用 & 添加该服务,例如:/opt/wildfly/bin/standalone.sh & service cron start & tail -f /var/log/cron-2.log

进入 docker 容器后,您可以看到 testing cron.... 将每分钟打印到文件中:/var/log/cron-1.log