docker run ubuntu / bin / bash vs 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を実行する2つの方法の間に何らかの違いがありますか?ある場合、それはどのようなものですか?

回答:


11

Dockerイメージでは、Dockerfileのディレクティブを使用CMDて、特定のコマンドがデフォルトで実行されるように指定できます。そして:

ユーザーが引数を指定docker runすると、で指定されたデフォルトがオーバーライドされCMDます。

たまたま、Ubuntu Dockerfileに指定されいるデフォルトのコマンドは、実際にはbashです。

CMD ["/bin/bash"]

したがって、Ubuntuイメージの特定のケースでは、docker run ... ubuntu /bin/bashと違いはありませんdocker run ... ubuntu

もちろん、これは常に真実である必要はありません。データベースエンジンのDockerfileは、デフォルトでデータベースコマンドを実行できます。その場合、対話型シェルが必要な場合は、行う必要がありますdocker run ... /bin/bash

一般的に、それがdocker runインタラクティブなシェルを提供するとは考えられません。/bin/bashシェルが必要かどうかを指定する方が安全です。


2

コマンドを提供しない場合、この場合は(インタラクティブ、ターミナル)/bin/bashを使用しているときに、のコマンドを使用するときに実行されるように定義されているデフォルトのプログラムに接続されます。-tiitrunDockerFile

たとえば、画像がフォアグラウンドでWebサーバーを実行している場合、runなしで使用する/bin/bashと、そのWebサーバー(実行されたデフォルトのプログラム)のログが表示されます。

コマンドを指定している間、あなたは、この「コマンド」を実行することで、画像上で何が起こっているのか、イメージで実行されているのかは気にしないと言っています。

Ubuntuでは、デフォルトのコマンドがbashあり、指定しない場合-ti、実行直後にコンテナが停止します。それは、非対話モードでbashを実行し、終了後、コンテナはもう何もすることがないからです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.