如何从Ruby映像在Docker容器中运行cron
我尝试将cron设置为在Docker容器中运行,但迄今为止没有成功 这是如何从Ruby映像在Docker容器中运行cron,ruby,cron,docker,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/h
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”。您的分析是正确的,cron作业没有运行。这是因为通常情况下,按照最佳实践,容器只运行一个进程,如Apache、NGINX等,而不运行任何正常的操作系统守护进程,如crond
没有crond意味着没有任何东西可以读取或执行crontab
有几种可能解决这个问题,但据我所知,没有完美的解决方案
- 最糟糕的是实际安装crond,以及类似supervisord的东西。它使容器变得更加复杂
- 您可以创建一个只运行cron的单独容器。从其他容器中装载所需的任何内容作为卷。这通常是建议的选项,但有局限性。cron容器需要了解很多其他容器的内部信息,cron作业不会在与其他容器相同的上下文中执行
- 您可以在主机上创建cron作业,并让它使用docker exec在容器中执行脚本。这很好,但会在主机和容器之间创建依赖关系。如果您无法访问主机的操作系统(例如,在托管的情况下,或者如果另一个团队管理主机),它也可能根本不起作用