©
本文档使用
php.cn手册 发布
容器的主要运行过程是ENTRYPOINT
和/或CMD
在Dockerfile
.一般建议您使用每个容器一个服务来区分关注的区域。该服务可能分到多个进程%28,例如,Apacheweb服务器启动多个工作进程%29。有多个进程是可以的,但是为了从Docker中获得最大的好处,请避免一个容器负责整个应用程序的多个方面。您可以使用用户定义的网络和共享卷连接多个容器。
容器的主进程负责管理它启动的所有进程。在某些情况下,主进程设计不好,并且在容器存在时没有很好地处理“收割”%28停止%29子进程。如果您的流程属于此类别,则可以使用--init
选项在运行容器时。大--init
标志将一个微小的init进程插入容器中作为主进程,并在容器退出时处理所有进程的收获。以这种方式处理这样的过程比使用完全的init进程(例如sysvinit
,,,upstart
,或systemd
来处理容器中的流程生命周期。
如果您需要在一个容器中运行多个服务,您可以通过几种不同的方式来完成这一任务。
将所有命令放入包装脚本中,并提供测试和调试信息。将包装器脚本作为CMD
这是一个很幼稚的例子。首先,包装器脚本:
#%21/bin/bash#启动第一个进程。[医]第一[医]进程-D状态=$?如果$Status-N0;然后回显“未能启动我的[医]第一[医]进程:$state“退出$Statusfi#启动第二个进程。[医]第二[医]进程-D状态=$?如果$Status-N0;然后回显“未能启动我的[医]第二[医]Process:$Status“Exit$Statsfi#朴素检查每分钟运行一次检查,以查看是否有任何进程退出。#这说明了如果要在容器中运行多个服务,需要完成的部分工作。如果检测到任何一个进程已经退出,容器将退出并带有一个错误#。#否则它将永远循环,每60秒醒来一次/bin/true;[医]第一[医]过程grep-q-v grep过程[医]一[医]状态=$?PS辅助grep我[医]第二[医]过程grep-q-v grep过程[医]二[医]状态=$?#如果上面的grep找到了什么,如果它们都不是0,它们将退出0状态#,那么如果$Process[医]一[医]状态-n0-o$进程[医]二[医]现状---N0然后回显“其中一个进程已经退出”。出口-1fi睡眠60完成
接下来,Dockerfile:
来自ubuntu的最新版本[医]第一[医]处理我的[医]第一[医]进程复制我的[医]第二[医]处理我的[医]第二[医]进程复制我的[医]包装器[医]脚本嘘我[医]包装器[医]script.sh CMD./我[医]包装器[医]script.sh
使用流程管理器,如supervisord
这是一种中等重量的方法,需要你打包。supervisord
以及它在图像%28中的配置,或者将您的图像建立在以下内容的基础上:supervisord
%29,以及它将管理的不同应用程序。然后你开始supervisord
,它为您管理您的流程。下面是一个使用这种方法的Dockerfile示例,它假定预先编写的supervisord.conf
,,,my_first_process
,和my_second_process
所有文件都与您的Dockerfile位于同一个目录中。
来自ubuntu:最新运行APT-获取更新&APT-获取安装-y监控器运行mkdir-p/var/log/主管复制Superord.conf/etc/Superor/con.d/visorord.conf复制我的[医]第一[医]处理我的[医]第一[医]进程复制我的[医]第二[医]处理我的[医]第二[医]过程CMD“/usr/bin/Superord”