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

Posted

技术标签:

【中文标题】在我将 cron 文件重新保存在 docker 容器中之前,Cron 作业不起作用【英文标题】:Cron job doesn't work until I re-save cron file in docker container 【发布时间】:2017-08-01 10:44:47 【问题描述】:

我正在使用 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

这是重新保存之前的系统日志输出:

这是之后的图片:

自行重启 cron 并不能修复它。我觉得它与行尾有关,所以这就是为什么你会在 dockerfile 中看到带有换行符的注释掉的“echo”策略。我还验证了(在保存之前)当我 crontab -l

时我的命令确实显示了

【问题讨论】:

你知道为什么它不工作了吗?你的解决方案是什么?我想我遇到了同样的问题。我只能在docker启动后使用“crontab -l | crontab -”触发cron工作,这对于生产当然是不可接受的。 【参考方案1】:

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

【讨论】:

【参考方案2】:

过去我也遇到过同样的问题。

这是一个在野外测试的工作示例,取自我们的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,认为你不需要导出环境变量的部分..

# 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

【讨论】:

以上是关于在我将 cron 文件重新保存在 docker 容器中之前,Cron 作业不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker 容器中运行 cron 作业

Docker 并行运行 cron 作业

关于docker容器cron定时任务的执行

docker exec 在 cron 中不工作

如何取消或停止Google App Engine Cron作业

通过 docker 日志查看 cron 输出,无需使用额外文件