【问题标题】:How to run cron in Docker container from Ruby image如何从 Ruby 映像在 Docker 容器中运行 cron
【发布时间】:2016-02-12 10:31:34
【问题描述】:

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

【问题讨论】:

标签: ruby cron docker


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢您的回答凯文。我最终使用了您的 worst 选项,因为这确实是我正在做的短期事情。只需要让它工作。
猜你喜欢
  • 2018-07-06
  • 2015-12-12
  • 2021-09-01
  • 1970-01-01
  • 2016-08-29
  • 2016-09-24
相关资源
最近更新 更多