当前位置: 首页 > 面试题库 >

当基本映像为centos vs ubuntu时,当以shell形式运行CMD / ENTRYPOINT时,不同的进程作为PID 1运行:

司空学智
2023-03-14
问题内容

使用下面的dockerfile构建并运行映像。

Dockerfile1

FROM ubuntu:trusty
ENTRYPOINT ping localhost

现在运行以下命令以查看容器中正在运行的进程。

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

现在, 将基本图像更改为ce​​ntos:latest。

修改后的Dockerfile

FROM centos:latest
ENTRYPOINT ping localhost

使用修改后的dockerfile构建并运行映像。再次运行’docker exec -it ps -ef’命令。

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,也会发生这种情况。

我以为使用shell形式/ bin / sh时,PID为1的过程(都使用ENTRYPOINT / CMN时)。

为什么我 通过更改基本图像 就能 看到不同的行为?


问题答案:

这是的行为bash。Docker仍在运行带有外壳的命令,您可以通过检查来识别该外壳:

$ docker inspect test-centos-entrypoint --format '{{.Config.Entrypoint}}'
[/bin/sh -c ping localhost]

您可以看到/ bin / sh的版本(请注意GNU bash部分):

$ 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.

/ bin /
sh的ubuntu版本(可能是破折号)甚至不支持该--version标志,并且未链接到bash。但是,如果您将ubuntu映像更改为使用bash而不是/
bin / sh,则会看到与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


 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 在Python中管道输出stdout时设置正确的编码 (10个答案) 7年前关闭。 我的程序可以在命令行中正常运行,但是当我将其作为cron作业运行时,它会因错误而崩溃: 它在语句上崩溃 为什么只有在应用程序作为cron作业运行时才会发生这种情况?如何解决? 我尝试了(没有帮助): Python是2.7 问题答案: 旁白:这是一个普遍的问题。 因此,这可

  • 本文向大家介绍Shell脚本获取进程的运行时间,包括了Shell脚本获取进程的运行时间的使用技巧和注意事项,需要的朋友参考一下 在我们的系统中,我曾写了一个脚本去定时更新一些repository,但偶尔会遇到问题,比如:git pull之时可能会卡在那里(可能由于某时刻的网络问题),它会阻碍后面的下一次更新。 所以我就在想,我今后启动这个脚本时,进行检查,如果上次运行的脚本还没结束,而且过了某个时

  • 问题内容: 使用 Linux shell ,如何从与当前工作目录不同的工作目录启动程序? 例如,我有一个二进制文件,可在 当前目录 中创建该文件。 该文件在目录内。 目前,我在目录中。我想开始运行程序,并在第三个目录中找到某个位置。 问题答案: 像这样调用程序: 括号导致生成子壳。然后,该子shell将其工作目录更改为,然后从执行。程序退出后,子Shell终止,返回到您从其开始的目录中的父Shel

  • 问题内容: 因此,我试图将cron作业设置为我创建的守护程序的一种看门狗。如果守护程序出错并失败,我希望cron作业定期重新启动它…我不确定这样做的可能性如何,但是我通读了一些cron教程,找不到任何可以做我的事情正在寻找… 我的守护程序是从Shell脚本开始的,所以我真的只是在寻找一种方法来运行cron作业,前提是该作业的先前运行仍未运行。 它确实为我试图使用锁定文件提供了解决方案,但我不确定是

  • 我有一个spring boot应用程序,其中包含一个主类。我的Docker文件如下: 我正在使用这个Docker文件创建一个Docker映像。让我们考虑这个docker文件是Docker1。 我有另一个Spring Boot应用程序(没有主类),Docker文件如下: 我使用Docker1作为第二个应用程序的docker映像的基础映像。当我试图运行第二个docker映像时,我得到一个错误“no m

  • 问题内容: 我从dockerfile构建了Docker映像。我看到映像已成功构建,但是该如何处理?它不应该能够作为容器运行吗? 问题答案: 运行它的具体方法取决于您是否为图像指定了标签/名称。 使用名称(让我们使用 Ubuntu ): 没有名称,只需使用ID: 请参阅 Docker运行参考 以获取更多信息。