我只是从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
在容器中可用,让我在外壳中进一步工作。
这里的几件事:
-
如果您要始终安装git,为什么要以
CMD
运行,然后手动作为新图像进行操作,而不仅仅是在DockerfileRUN
指令中运行? -
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