为什么当"/bin/bash"命令附加到"docker run -it IMAGE ID"时,Dockerfile 中的命令不执行?



我只是从docker开始。我有这个dockerfile:

FROM jonathonf/manjaro 
CMD ["pacman", "-S", "--noconfirm", "git"]

当我用

构建图像时
sudo docker build -t uname/description:tag  .

然后用

运行它
sudo docker run IMAGE_ID 

,其中 IMAGE_ID是我从 sudo docker images命令中获得的ID,则在dockerfile CMD ["pacman", "-S", "--noconfirm", "git"]运行中的命令,安装了git,创建了一个容器(我可以提交(。

如果我用

运行图像
sudo docker run IMAGE_ID /bin/bash

未执行来自Dockerfile的CMD

我希望它能够从Dockerfile运行命令,使git在容器中可用,让我在外壳中进一步工作。

这里的几件事:

  1. 如果您要始终安装git,为什么要以CMD运行,然后手动作为新图像进行操作,而不仅仅是在Dockerfile RUN指令中运行?

  2. docker run...之后您放置的任何内容都将以CMD运行并覆盖它。如果您不想覆盖它,则应将其作为ENTRYPOINT。但实际上你应该做1。

当您在Dockerfile中使用CMD ["pacman", "-S", "--noconfirm", "git"]时,将pacman -S --noconfirm git设置为容器的PID-1过程。

现在,当您运行容器sudo docker run IMAGE_ID时,第一个进程将是CMD中指定的过程。您可以通过运行docker exec -it container-id ps -ef

来验证这一点

运行sudo docker run IMAGE_ID /bin/bash时,Docker容器的PID-1过程被/bin/bash替换。

[user@jumphost ~]$ docker run -itd -p 3666:3306 alpine sh
dcef6d1cc121bfd195552fa7639038ac513a74eaa035a855bb7917dd620be642
[user@jumphost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
dcef6d1cc121        alpine              "sh"                2 seconds ago       Up 2 seconds        0.0.0.0:3666->3306/tcp   fervent_euclid
[user@jumphost ~]$ docker exec -it dcef6d1cc121 ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    7 root      0:00 ps -ef
[user@jumphost ~]$

还要了解有关CMD的更多信息。

还检查Docker入口点及其与CMD的区别。

希望这会有所帮助。

Docker的工作原理。您从Dockerfile中覆盖CMD。如果您想同时实现git安装和bash命令,请将您的cmd命令移至运行命令。请考虑dockerfile文档https://docs.docker.com/engine/reference/builder/#run

最新更新