docker 运行 ubuntu /bin/bash 与 docker 运行 ubuntu

Mic*_*ael 20 docker

Docker 版本 17.06.0-ce

我正在通过观看视频课程来学习 Docker。

讲师展示:

sudo docker run -ti ubuntu /bin/bash
Run Code Online (Sandbox Code Playgroud)

使用图像 ubuntu 运行 docker。而让我烦恼的是/bin/bash\man docker run显示这/bin/bash是一个命令。那就是docker run IMAGE [COMMAND]。好吧,没关系。但是两者有什么区别

sudo docker run -ti ubuntu 
Run Code Online (Sandbox Code Playgroud)

sudo docker run -ti ubuntu /bin/bash
Run Code Online (Sandbox Code Playgroud)

对我来说没有。而且讲师没有将注意力集中在命令上。他说我们只是运行docker。这是他在课程中的第一个命令。然后他表明我们已经与主机隔离了,我们可以自由地破坏我们想要的东西而没有任何损坏(如rm -rf /bin)。

我检查了:

$ sudo docker run -ti ubuntu
root@aaf7cd26fe18:/# echo $SHELL
/bin/bash


$ sudo docker run -ti ubuntu /bin/bash
root@6b2570958216:/# echo $SHELL
/bin/bash
Run Code Online (Sandbox Code Playgroud)

好吧,为了我自己,我决定把这/bin/bash部分当作垃圾扔掉。

但无论如何我决定问你:也许这两种运行 Docker 的方式有一些区别?如果有,它是什么样的?

mur*_*uru 17

Docker 镜像可以使用Dockerfile 中CMD指令指定默认运行某个命令。和:

如果用户docker run将参数指定为 ,则它们将覆盖 中指定的默认值CMD

碰巧的是,为Ubuntu Dockerfile指定的默认命令实际上是 bash:

CMD ["/bin/bash"]
Run Code Online (Sandbox Code Playgroud)

因此,对于Ubuntu的图像的具体情况,docker run ... ubuntu /bin/bash从没有什么不同docker run ... ubuntu

当然,这不必总是如此。默认情况下,数据库引擎的 Dockerfile 可能会运行数据库命令。在这种情况下,如果您需要交互式 shell,则需要执行docker run ... /bin/bash.

通常,您不能假设这docker run会给您一个交互式 shell。指定/bin/bash是否需要 shell 会更安全。