如何在 Ruby 图像的 Docker 容器中 运行 cron
How to run cron in Docker container from Ruby image
我已经尝试在我的 Docker 容器中将 cron 设置为 运行,但到目前为止没有成功。
这是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 似乎是 运行ning:
$ 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
没有附加任何内容,所以 运行 没有显示。
然后,如果我从容器中 运行s $ cron
注册我的 hello-cron
文件,并且日志文件将每分钟附加 "Hello world"。
您的分析是正确的,cron 作业不是 运行ning。发生这种情况是因为通常情况下,根据最佳实践,容器只有 运行 一个进程,例如 Apache、NGINX 等 - 它不会 运行 任何正常的操作系统守护进程,例如 crond。
没有 crond 意味着没有任何东西可以读取或执行您的 crontab。
有几种可能解决这个问题,但据我所知没有完美的解决方案。
最糟糕的是实际安装 crond,以及诸如 supervisord 之类的东西。它使您的容器变得更加复杂。
您可以创建一个单独的容器,运行它只是 cron。将其他容器中需要的任何内容作为卷安装。这通常是推荐的选项,但它有局限性。 cron 容器需要了解其他容器的很多内部信息,并且 cron 作业不会在与其他容器相同的上下文中执行。
您可以在主机上创建一个 cron 作业,并让它使用 docker exec 在容器中执行脚本。这很好用,但会在主机和容器之间产生依赖关系。如果您无法访问主机的操作系统(例如,在托管情况下,或者不同的团队管理主机),它也可能根本无法工作。
我已经尝试在我的 Docker 容器中将 cron 设置为 运行,但到目前为止没有成功。
这是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 似乎是 运行ning:
$ 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
没有附加任何内容,所以 运行 没有显示。
然后,如果我从容器中 运行s $ cron
注册我的 hello-cron
文件,并且日志文件将每分钟附加 "Hello world"。
您的分析是正确的,cron 作业不是 运行ning。发生这种情况是因为通常情况下,根据最佳实践,容器只有 运行 一个进程,例如 Apache、NGINX 等 - 它不会 运行 任何正常的操作系统守护进程,例如 crond。
没有 crond 意味着没有任何东西可以读取或执行您的 crontab。
有几种可能解决这个问题,但据我所知没有完美的解决方案。
最糟糕的是实际安装 crond,以及诸如 supervisord 之类的东西。它使您的容器变得更加复杂。
您可以创建一个单独的容器,运行它只是 cron。将其他容器中需要的任何内容作为卷安装。这通常是推荐的选项,但它有局限性。 cron 容器需要了解其他容器的很多内部信息,并且 cron 作业不会在与其他容器相同的上下文中执行。
您可以在主机上创建一个 cron 作业,并让它使用 docker exec 在容器中执行脚本。这很好用,但会在主机和容器之间产生依赖关系。如果您无法访问主机的操作系统(例如,在托管情况下,或者不同的团队管理主机),它也可能根本无法工作。