我有一个带主管的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自动执行。
答案 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