如何从Ruby映像运行Docker容器中的cron

我已经尝试设置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 

当我login到容器实例时,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”。

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

没有crond的意思,没有什么会读取或执行你的crontab。

有几种可能性来解决这个问题,但是没有我所知道的完美解决scheme。

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

  • 你可以创build一个单独的容器,除了cron之外什么都不运行。 将其他容器中所需的任何东西装入卷中。 这通常是推荐的select,但是它有局限性。 cron容器需要知道很多关于其他容器的内部信息,而cron作业不会像其他容器一样在上下文中执行。

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