我已尝试将cron设置为在我的Docker容器中运行,但到目前为止没有成功。
这是Dockerfile
:
FROM ruby:2.2.2
# Add crontab file in the cron directory
RUN apt-get install -y rsyslog
ADD crontab /etc/cron.d/hello-cron
# Give execution rights on the cron job
RUN chmod +x /etc/cron.d/hello-cron
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Run the command on container startup
RUN service cron start
当我登录到容器实例时,cron似乎正在运行:
$ service cron status
cron is running.
/etc/cron.d
有我的工作:
$ cat /etc/cron.d/hello-cron
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
但/var/log/cron.log
没有附加任何内容,因此它似乎无法运行。
如果我那么,在容器内,运行$ cron
它会注册我的hello-cron
文件,日志文件会有" Hello world"每分钟都附上。
答案 0 :(得分:2)
您的分析正确,cron作业未运行。这是因为通常情况下,通过最佳实践,容器只运行一个进程,例如Apache,NGINX等。它不运行任何正常的操作系统守护进程,例如crond。
没有crond意味着,没有任何内容可以读取或执行你的crontab。
有几种可能性可以解决这个问题,但我所知道的还没有完美的解决方案。
最糟糕的是实际安装crond,以及supervisord之类的东西。它使您的容器变得更加复杂。
您可以创建一个单独的容器,只运行cron。从其他容器中装载您需要的任何卷。这通常是推荐的选项,但它有局限性。 cron容器需要了解很多其他容器的内部结构,并且cron作业不会在与其他容器相同的上下文中执行。
您可以在主机上创建一个cron作业,并让它使用docker exec在容器中执行脚本。这很好用,但在主机和容器之间创建了依赖关系。如果您无权访问主机的操作系统(例如,在托管情况下,或者如果其他团队管理主机),它也可能根本无法工作。