为什么“ service cron start”在Docker文件中不起作用?

Mar*_*oma 5 cron service docker

当我使用正在运行的Docker容器中的启动cron服务时

service cron start
Run Code Online (Sandbox Code Playgroud)

有用。但是线

RUN service cron start
Run Code Online (Sandbox Code Playgroud)

在Dockerfile中似乎没有任何作用。为什么?

备择方案

我考虑过将其更改CMDCMD ["startup.sh"]先运行service cron start然后再运行run.py(Python Web服务器)的方式。但是我希望Web服务器不要以root用户身份运行,因此service cron start会失败。

BMi*_*tch 8

每个RUN命令都使用来自上一步的结果映像和RUN作为容器命令的arg在您的构建主机上创建一个临时容器。容器仅在您执行的命令处于活动状态时运行,因此如果它是像您所做的那样启动后台守护程序的命令,则容器在命令返回时退出,而不是在后台守护程序退出时退出。

RUN命令用于构建您的图像,它是分层文件系统和各种元数据,这些元数据告诉 docker 如何使用该文件系统(环境变量、入口点和/或默认运行的命令等)。它与 a 非常不同,CMD它告诉 docker 当该图像变成容器时要运行什么。因此,对于您需要在容器中运行的进程,它需要成为您的一部分,CMD或者ENTRYPOINT因为从中运行的进程RUN不是静态文件系统映像的一部分。

我也会听从其他人的建议,复制一个已经存在的带有 cron 的图像,不需要重新发明这个轮子。如果您的容器中需要有多个进程,您可能需要使用像 supervisord 这样的工具来一起运行 cron 和您的应用程序。尽管在可能的情况下,您应该弄清楚如何将其分解为可以独立更新的多个容器。


Buk*_*gey 5

当您执行命令时,service cron start进程 cron 将从 shell 中分离出来。但 Docker 仅在主进程处于活动状态时才工作。

您需要将 cron 移至entrypoint. 这里有一个很好的例子