docker run ubuntu /bin/bash と docker run ubuntu の比較

docker run ubuntu /bin/bash と docker run ubuntu の比較

Docker バージョン 17.06.0-ce

ビデオコースを見てDockerを勉強しています。

講師は以下を示します:

sudo docker run -ti ubuntu /bin/bash

ubuntuイメージでdockerを実行します。そして、私を困らせるのは/bin/bash\、 がコマンドであるman docker runことを示しています。それは です。まあ、大丈夫です。しかし、/bin/bashdocker 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 つの方法には何らかの違いがあるのでしょうか? あるとしたら、それはどのようなものですか?

答え1

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

ユーザーが に引数を指定した場合、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の使用時に、でコマンドを使用するときに実行されるように定義されているデフォルトのプログラムに接続されます。-tiitrunDockerFile

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

コマンドを指定すると、イメージ上で何が起こっているか、何が実行されているかに関係なく、この「コマンド」を実行して対話型ターミナルを提供するように指示されます。

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

答え3

以下のコマンドを実行してみると違いが分かります

sudo docker run -ti python
sudo docker run -ti python /bin/bash

関連情報