如何在Ruby镜像中运行Docker容器中的cron

时间:2015-11-11 10:36:41

标签: ruby cron docker

我已尝试将cron设置为在我的Docker容器中运行,但到目前为止没有成功。

这是Dockerfile

的与cron相关的部分
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"每分钟都附上。

1 个答案:

答案 0 :(得分:2)

您的分析正确,cron作业未运行。这是因为通常情况下,通过最佳实践,容器只运行一个进程,例如Apache,NGINX等。它不运行任何正常的操作系统守护进程,例如crond。

没有crond意味着,没有任何内容可以读取或执行你的crontab。

有几种可能性可以解决这个问题,但我所知道的还没有完美的解决方案。

  • 最糟糕的是实际安装crond,以及supervisord之类的东西。它使您的容器变得更加复杂。

  • 您可以创建一个单独的容器,只运行cron。从其他容器中装载您需要的任何卷。这通常是推荐的选项,但它有局限性。 cron容器需要了解很多其他容器的内部结构,并且cron作业不会在与其他容器相同的上下文中执行。

  • 您可以在主机上创建一个cron作业,并让它使用docker exec在容器中执行脚本。这很好用,但在主机和容器之间创建了依赖关系。如果您无权访问主机的操作系统(例如,在托管情况下,或者如果其他团队管理主机),它也可能根本无法工作。