Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Ruby映像在Docker容器中运行cron_Ruby_Cron_Docker - Fatal编程技术网

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

如何从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

我尝试将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”。

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

没有crond意味着没有任何东西可以读取或执行crontab

有几种可能解决这个问题,但据我所知,没有完美的解决方案

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

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

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


谢谢你的回答,凯文。我最终选择了你最糟糕的选择,因为这确实是我正在做的一件短期事情。只是需要让它工作起来。