docker制作镜像套用如何同时使用2个CMD

378人浏览 / 0人评论

一、第一版镜像制作的docker

第一版镜像主要想把nscd和rsyslog在后台进行启动

FROM ......

RUN echo '#!/bin/bash\n\ /usr/sbin/nscd -f /etc/nscd.conf & \n /usr/sbin/rsyslogd -n \n exec "$@"' > /my_script.sh

RUN chmod +x /my_script.sh

ENTRYPOINT ["/my_script.sh"]

二、第二版制作镜像

随意制作就可以了,传参CDM就行。 

 

三、启动容器

/path/to/my/process --option1 value1 --option2 value2   这个命令会传给 my_script.sh脚本的 exec "$@" 来执行,这样进程启动就是 PID 1

docker run -it my_image /path/to/my/process --option1 value1 --option2 value2 

 

四、知识补充

容器的生命周期与其主进程(PID 1)紧密相关。下面是有关容器生命周期和主进程的一些关键知识点:

  1. 容器生命周期:容器从创建到最终停止的过程称为容器生命周期。以下是容器生命周期的主要阶段:

    • 创建:根据镜像创建容器,为容器分配唯一 ID,并设置配置。
    • 启动:启动容器,创建容器层,并运行容器中的主进程。
    • 运行:容器中的主进程持续运行,处理请求并执行任务。
    • 停止:主进程终止后,容器停止运行。用户也可以通过 docker stop 命令来停止容器。
    • 删除:通过 docker rm 命令删除容器。删除容器后,其容器层及相关资源将被清理。
  2. 主进程(PID 1):容器中的主进程负责处理容器的任务和请求。容器的生命周期与主进程的生命周期关联。主进程的启动、运行和终止直接影响容器的状态。

  3. 前台进程与后台进程:在容器中,主进程应该作为前台进程运行。这意味着主进程将直接与容器的 STDOUT 和 STDERR 通信,并且不会自行结束或放入后台。如果主进程是后台进程(例如,通过在命令后添加 & 符号启动),容器将无法正确监控其生命周期,并且可能会立即退出。

  4. CMD 和 ENTRYPOINT:Dockerfile 中的 CMDENTRYPOINT 指令用于定义容器的主进程。ENTRYPOINT 定义了要执行的命令,而 CMD 提供了传递给该命令的默认参数。如果同时定义了 ENTRYPOINTCMD,则 CMD 中的内容将作为参数传递给 ENTRYPOINT。如果在运行容器时指定了新参数,这些参数将覆盖 CMD 中的默认参数。

  5. 信号处理:容器中的主进程需要能够正确处理操作系统信号,如 SIGTERM 和 SIGINT。当用户通过 docker stop 命令停止容器时,Docker 将向主进程发送 SIGTERM 信号。主进程应捕获此信号并执行适当的清理操作,然后终止。如果主进程在规定的超时时间内未终止,Docker 将发送 SIGKILL 信号强制终止容器。

了解容器的生命周期和主进程的关键知识点有助于正确配置和管理 Docker 容器,确保容器能够稳定、高效地运行。

  

全部评论