当我使用
在正在运行的Docker容器中启动cron服务时service cron start
它有效。但行
RUN service cron start
Dockerfile中的似乎没有效果。为什么呢?
我想过简单地将CMD
更改为CMD ["startup.sh"]
,首先运行service cron start
然后run.py
(Python网络服务器)。但我希望Web服务器不以root身份运行,因此service cron start
将失败。
答案 0 :(得分:1)
每个System.Diagnostics.Process.GetProcesses
命令使用前一步骤中生成的图像和RUN
arg作为容器命令,在构建主机上创建一个临时容器。只有在您执行的命令处于活动状态时,容器才会运行,因此,如果它是一个启动您已完成的后台守护程序的命令,则容器将在命令返回时退出,而不是在后台守护程序退出时退出。
RUN
命令用于构建映像,这是分层文件系统和各种元数据,告诉docker如何使用该文件系统(环境变量,入口点和/或命令默认运行等) 。它与RUN
非常不同,CMD
告诉docker将图像转换为容器时要运行的内容。因此,对于需要在容器中运行的进程,该进程需要成为CMD
或ENTRYPOINT
的一部分,因为从RUN
运行的进程不是静态文件系统映像的一部分。
我也会遵循其他人的建议,用cron复制已经存在的图像,不需要重新发明这个轮子。如果需要在容器内部有多个进程,您可能希望使用像supervisord这样的工具来一起运行cron和您的应用程序。尽管可能,您应该弄清楚如何将其分解为可以独立更新的多个容器。
答案 1 :(得分:0)
执行命令service cron start
时,进程cron将与shell分离。但Docker仅在主进程存活时才能工作。
您需要将cron移至entrypoint
。一个很好的例子here