在我将 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 作业不起作用的主要内容,如果未能解决你的问题,请参考以下文章