
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 つの方法には何らかの違いがあるのでしょうか? あるとしたら、それはどのようなものですか?
答え1
Dockerイメージでは、デフォルトで特定のコマンドを実行するように指定することができます。CMD
Dockerfile内のディレクティブ。 そして:
ユーザーが に引数を指定した場合、
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
の使用時に、でコマンドを使用するときに実行されるように定義されているデフォルトのプログラムに接続されます。-ti
i
t
run
DockerFile
たとえば、イメージがフォアグラウンドで Web サーバーを実行している場合、 を使用run
せずに使用した後に表示されるのは/bin/bash
その Web サーバー (実行されたデフォルトのプログラム) のログです。
コマンドを指定すると、イメージ上で何が起こっているか、何が実行されているかに関係なく、この「コマンド」を実行して対話型ターミナルを提供するように指示されます。
Ubuntu ではデフォルトのコマンドは でありbash
、指定しない場合は-ti
コンテナーは実行直後に停止します。これは、bash が非対話モードで実行され、終了するとコンテナーは何もすることがなくなるためです。
答え3
以下のコマンドを実行してみると違いが分かります
sudo docker run -ti python
sudo docker run -ti python /bin/bash