为什么“服务cron启动”不在Docker文件中工作?

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

service cron start

有用.但行

RUN service cron start

在Dockerfile中似乎没有效果.为什么?

备择方案

我想过简单地将我的CMD改为CMD [“startup.sh”],它首先运行服务cron start然后运行run.py(Python webserver).但我希望Web服务器不以root身份运行,因此服务cron start会失败.

最佳答案 每个RUN命令都使用前一步骤中生成的图像和RUN arg作为容器命令在构建主机上创建一个临时容器.只有在您执行的命令处于活动状态时,容器才会运行,因此如果它是一个像您所做的那样启动后台守护程序的命令,则容器会在命令返回时退出,而不是在后台守护程序退出时退出.

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

我也会按照别人的建议,用cron复制已经存在的图像,不需要重新发明这个轮子.如果需要在容器内部有多个进程,您可能希望使用像supervisord这样的工具来一起运行cron和您的应用程序.虽然在可能的情况下,您应该弄清楚如何将其分解为可以独立更新的多个容器.

点赞