为什么“service cron start”不在Docker文件中工作?
当我在正在运行的Docker容器中启动cron服务时
service cron start
有用。 但是行
RUN service cron start
在Dockerfile中似乎没有效果。 为什么?
备择scheme
我想简单地改变我的CMD
到CMD ["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在图像变成容器时要运行什么是非常不同的。 因此,对于需要在容器中运行的进程,这需要成为CMD
或ENTRYPOINT
一部分,因为从RUN
运行进程不是静态文件系统映像的一部分。
我也会按照别人的build议,用cron复制一个已经存在的图像,不需要重新发明这个轮子。 如果需要在容器中有多个进程,可能需要使用像supervisord这样的工具来一起运行cron和您的应用程序。 尽pipe可能的话,你应该弄清楚如何将其分解成多个可以独立更新的容器。