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

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

service cron start 

有用。 但是行

 RUN service cron start 

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

备择scheme

我想简单地改变我的CMDCMD ["startup.sh"] ,它首先运行service cron start ,然后run.py (Pythonnetworking服务器)。 但是我希望Web服务器不能以root身份运行,因此service cron start会失败。

当你执行命令service cron start进程cron将会从shell中分离出来。 但是Docker只在主进程还活着时才能工作。

您需要将cron移入entrypoint 。 这是一个很好的例子

每个RUN命令都会使用上一步中生成的映像以及RUN arg作为容器的命令在生成主机上创build一个临时容器。 只要执行的命令处于活动状态,一个容器就会运行,所以如果它是一个启动后台守护进程的命令,那么当命令返回时,容器将退出,而不是在后台守护进程退出时退出。

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

我也会按照别人的build议,用cron复制一个已经存在的图像,不需要重新发明这个轮子。 如果需要在容器中有多个进程,可能需要使用像supervisord这样的工具来一起运行cron和您的应用程序。 尽pipe可能的话,你应该弄清楚如何将其分解成多个可以独立更新的容器。