docker run ubuntu / bin / bash与docker run ubuntu


15

Docker版本17.06.0-CE

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

讲师显示:

sudo docker run -ti ubuntu /bin/bash

使用镜像Ubuntu运行docker。而困扰我的是/bin/bash\man docker run显示这/bin/bash是一个命令。那是docker run IMAGE [COMMAND]。好吧,没关系。但是之间有什么区别

sudo docker run -ti ubuntu 

sudo docker run -ti ubuntu /bin/bash

对我来说没有。而且讲师不会将注意力集中在命令上。他说我们只是在运行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

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

但是无论如何,我还是决定问你:也许运行Docker的两种方式之间有些区别?如果有,那是什么感觉?

Answers:


11

Docker映像可以使用Dockerfile中指令指定默认情况下将运行某个命令CMD。和:

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

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

CMD ["/bin/bash"]

因此,对于Ubuntu映像的特定情况,与docker run ... ubuntu /bin/bash没什么不同docker run ... ubuntu

当然,不一定总是如此。默认情况下,数据库引擎的Dockerfile可以运行database命令。在这种情况下,如果需要交互式外壳,则需要这样做docker run ... /bin/bash

通常,您不能假定它docker run会为您提供交互式外壳。指定/bin/bash是否需要外壳是更安全的。


2

如果不提供命令(在您的情况下为)/bin/bash,则在使用-tii交互式,t终端)时,您将附加到默认程序,该程序已定义为runDockerFile

例如,如果图像在前台运行Web服务器,则在run不使用的情况下使用后将看到的/bin/bash是该Web服务器的日志(已运行的默认程序)。

指定命令时,您是在说我不在乎图像上正在发生或正在运行的内容,通过运行此“命令”可以为我提供一个交互式终端。

在Ubuntu中,默认命令是bash,如果不提供,-ti则容器将在运行后立即停止。因为它是在非交互模式下运行bash,并且完成后容器不再需要执行任何操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.