在容器中,主要的运行过程是通过 ENTRYPOINT 或 CMD 指令在 Dockerfile 的末尾定义的。通常建议每个容器仅运行一项服务,以便更好地分离关注区域。虽然可以在一个容器中运行多个进程,但为了最大限度地利用 Docker,建议避免让一个容器承担整个应用程序的多重职责。可以利用用户定义的网络和共享卷来连接多个容器。
容器的主要过程负责管理其启动的所有进程。在某些情况下,主进程可能设计不当,导致在容器退出时无法优雅地处理子进程的“收割”。如果您的进程属于这一类,可以在运行容器时使用 –init 选项。该 –init 标志会在容器中插入一个小型的 init 进程,用于处理所有进程的收割,从而优于依赖传统的初始化系统或 systemd 来管理容器中的进程生命周期。
如果需要在一个容器中运行多个服务,可以通过几种不同的方式来实现。
一种方法是将所有命令放入一个包装脚本中,并在其中包含测试和调试信息。然后,使用 CMD 以您的身份运行该包装脚本。以下是一个简单的示例:
包装脚本:

接下来是 Dockerfile:
FROM Ubuntu:latest
COPY My_first_Process My_first_Process
COPY My_second_Process My_second_Process
COPY My_wrapper_script.sh My_wrapper_script.sh
CMD ./My_wrapper_script.sh
如果您有一个需要首先启动并保持运行的主要进程,同时又需要临时运行其他进程,可以利用 Bash 的作业控制来简化这一过程。包装脚本示例如下:

Dockerfile:
FROM Ubuntu:latest
COPY My_Main_Process My_Main_Process
COPY My_helper_Process My_helper_Process
COPY My_wrapper_script.sh My_wrapper_script.sh
CMD ./My_wrapper_script.sh
另一种方法是使用类似于 supervisord 的进程管理器。这是一种中等复杂度的方法,您需要将 supervisord 映像及其配置与所管理的不同应用程序一起打包。启动 supervisord 后,它将为您管理这些进程。以下是使用这种方法的示例,假设 Dockerfile、supervisord.conf、My_first_Process 和 My_second_Process 文件都位于同一目录:
FROM Ubuntu:latest
RUN apt-get update && apt-get install -y supervisord
RUN mkdir -p /var/log/supervisord
COPY supervisord.conf /etc/supervisord/conf.d/supervisord.conf
COPY My_first_Process My_first_Process
COPY My_second_Process My_second_Process
CMD [“/usr/bin/supervisord”]
