我写了一个DOCKERFILE并使用CMD ["/bin/bash", "-c", "script1.sh && script2.sh"
来启动容器。
运行容器之后,我发现PID 1的进程是一个带有CMD列bash的进程,而script2.sh是它的子进程。
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 4491 wait ? 00:00:00 bash
0 S 0 8 1 0 80 0 - 4494 wait ? 00:00:00 script2
0 S 0 10 8 99 80 0 - 1632452 futex_ ? 00:01:05 java
4 S 0 64 0 0 80 0 - 4545 wait ? 00:00:00 bash
0 R 0 79 64 0 80 0 - 1785 - ? 00:00:00 ps
如果我使用CMD [ "/bin/bash", "-c", "script2.sh" ]
,则PID 1的过程是script2.sh。
有人可以帮助解释第一种情况会发生什么吗?
答案 0 :(得分:0)
在这两种情况下,bash
都以PID 1开始。
对于第一个示例,bash
将运行命令"script1.sh && script2.sh"
,首先调用子shell来执行script1.sh
,然后执行另一个子shell来执行script2.sh
if script1.sh
及其子shell退出时没有错误。完整输出(即来自ps -ef
)将命令显示为/bin/bash -c "script1.sh && script2.sh"
。
对于第二个示例,bash
正在运行单个命令,并且基本上是exec
该命令。不需要子shell,script2.sh
可以替换并成为PID 1。