当基本映像为centos vs ubuntu时,以shell形式运行CMD / ENTRYPOINT时,不同的进程作为PID 1运行: [英] Different process are running as PID 1 when running CMD/ENTRYPOINT in shell form when the base images is centos vs ubuntu:trusty
问题描述
使用以下dockerfile构建并运行映像。
Build and run an image using the below dockerfile.
Dockerfile1
Dockerfile1
FROM ubuntu:trusty
ENTRYPOINT ping localhost
现在运行以下命令以查看容器中正在运行的进程。
Now run the below command to see the processes running in the container.
docker exec -it <container> ps -ef
PID 1进程正在运行/ bin / sh -c ping localhost
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 11:35 ? 00:00:00 /bin/sh -c ping localhost
root 8 1 0 11:35 ? 00:00:00 ping localhost
root 9 0 0 11:35 pts/0 00:00:00 ps -ef
现在将仅基础映像更改为centos:latest。
Now change ONLY the base image to centos:latest.
修改后的Dockerfile
Modified Dockerfile
FROM centos:latest
ENTRYPOINT ping localhost
使用修改后的dockerfile生成并运行映像。
再次运行'docker exec -it ps -ef'命令。
Build and run an image using the modified dockerfile. Run the 'docker exec -it ps -ef' command again.
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 11:32 ? 00:00:00 ping localhost
root 8 0 0 11:33 pts/0 00:00:00 ps -ef
但是现在PID 1进程正在运行'ping localhost'
即使将ENTRYPOINT替换为CMD,也会发生这种情况
This happen even when ENTRYPOINT is replaced with CMD.
我认为,使用shell形式/ bin / sh时,PID为1的进程(均使用ENTRYPOINT / CMN时)。
I thought when using the shell form /bin/sh is the process with PID as 1 (both when ENTRYPOINT/CMN being used).
有什么想法可以通过更改基本图像来公正看到不同的行为?
Any ideas why I am seeing a different behaviour just by changing the base image?
推荐答案
这是 bash
的行为。 Docker仍在运行带有外壳的命令,您可以通过外壳进行识别:
This is the behavior of bash
. Docker is still running the command with a shell which you can identify with an inspect:
$ docker inspect test-centos-entrypoint --format '{{.Config.Entrypoint}}'
[/bin/sh -c ping localhost]
您可以看到/ bin / sh的版本(请注意GNU bash部分):
You can see the version of /bin/sh (note the GNU bash part):
$ docker exec -it quicktest /bin/sh --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Ubuntu版本的/ bin / sh(可能是破折号)甚至不支持-version
标志,并且未链接到bash。但是,如果将ubuntu映像更改为使用bash而不是/ bin / sh,则会看到与centos匹配的行为:
The ubuntu version of /bin/sh (possibly dash) doesn't even support the --version
flag and is not linked to bash. But if you change the ubuntu image to use bash instead of /bin/sh, you'll see the behavior matching centos:
$ cat df.ubuntu-entrypoint
FROM ubuntu:trusty
ENTRYPOINT [ "/bin/bash", "-c", "ping localhost" ]
$ DOCKER_BUILDKIT=0 docker build -t test-ubuntu-entrypoint -f df.ubuntu-entrypoint .
Sending build context to Docker daemon 23.04kB
Step 1/2 : FROM ubuntu:trusty
---> 67759a80360c
Step 2/2 : ENTRYPOINT [ "/bin/bash", "-c", "ping localhost" ]
---> Running in 5c4161cafd6b
Removing intermediate container 5c4161cafd6b
---> c871fe2e2063
Successfully built c871fe2e2063
Successfully tagged test-ubuntu-entrypoint:latest
$ docker run -d --name quicktest2 --rm test-ubuntu-entrypoint
362bdc75e4a960854ff17cf5cae62a3247c39079dc1290e8a85b88114b6af694
$ docker exec -it quicktest2 ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:05 ? 00:00:00 ping localhost
root 8 0 0 13:05 pts/0 00:00:00 ps -ef
这篇关于当基本映像为centos vs ubuntu时,以shell形式运行CMD / ENTRYPOINT时,不同的进程作为PID 1运行:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!