在我在docker容器中重新保存cron文件之前,Cron作业不起作用

时间:2017-03-10 23:25:13

标签: docker cron

我正在使用docker Mongo容器,并尝试通过bash脚本进行备份。该脚本自行执行,运行正常。我也可以在syslog中看到cron正在运行,但命令没有显示出来。如果我用crontab -e打开我的文件,然后保存并退出(:wq),然后重新启动cron,作业运行正常。

以下是我的dockerfile的相关部分:

ADD mongocron /etc/cron.d/
RUN tr -d '\015' < /etc/cron.d/mongocron > /etc/cron.d/mongocron
#RUN touch /etc/cron.d/mongocron
#RUN echo "* * * * * /db_scripts/MongoDBBackup.sh >> /db_scripts/logs/backup.log\n" > /etc/cron.d/mongocron
RUN crontab /etc/cron.d/mongocron
RUN chmod 0644 /etc/cron.d/mongocron

这是mongocron文件中的内容:

* * * * * /db_scripts/MongoDBBackup.sh >> /db_scripts/logs/backup.log

这是重新保存之前的syslog输出: enter image description here

以下是一张照片: After resaving

自行重启cron并不能解决问题。我觉得它与行结尾有关,所以这就是为什么你在dockerfile中用换行符看到注释掉的“echo”策略。我还验证了(在保存之前)我的命令确实显示在我crontab -l <​​/ p>时

2 个答案:

答案 0 :(得分:0)

我过去一直在努力解决同样的问题。

以下是一个工作示例,在我们的DevBlog中进行了野外测试。

FROM ubuntu:latest

ADD start.sh /bin/start.sh
RUN chmod +x /bin/start.sh

# Add crontab file in the cron directory
ADD crontab /etc/cron.d/thecron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/thecron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# start script
CMD /bin/bash /bin/start.sh

start.sh,认为你不需要导出env变量的部分..

# export all environment variables to use in cron
env | sed 's/^\(.*\)$/export \1/g' > /root/envs.sh
chmod +x /root/envs.sh

# Run the command on container startup
cron && tail -f /var/log/cron.log

在构建图像时复制的Cron文件。

0 1 * * * root . /root/envs.sh;/bin/backup.sh >> /var/log/cron.log 2>&1

答案 1 :(得分:0)

我也遇到了这个问题,原因是文件末尾缺少换行符。 @opHASnoNAME的答案是正确的,但是当它仅在编辑后才开始工作时,是换行的原因。您的编辑器默认情况下只会添加它。