我写了一个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。
有人能解释一下第一个案子会发生什么吗?

最佳答案

在这两种情况下,bash都以PID 1开头。
对于第一个例子,bash将运行命令"script1.sh && script2.sh",首先调用子shell执行script1.sh,然后另一个子shell执行script2.sh如果script1.sh及其子shell没有错误退出。完整输出(即来自ps -ef)将命令显示为/bin/bash -c "script1.sh && script2.sh"
对于第二个示例,bash运行的是一个命令,实际上是该命令。不需要子shell,exec可以替换并成为PID 1。

关于linux - 通过&&运行命令时docker容器中进程的PID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45748034/

10-10 21:17