dockerコンテナでbashを実行するにはどうすればいいですか? 質問する

dockerコンテナでbashを実行するにはどうすればいいですか? 質問する

docker/whalesay イメージから作成されたコンテナ内で任意のシェル コマンドを実行できます。

$ docker run docker/whalesay ls -l
total 56
-rw-r--r-- 1 root root  931 May 25  2015 ChangeLog
...

bashただし、このイメージから作成されたコンテナでは実行できません。

$ docker run docker/whalesay bash

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
7ce600cc9904        docker/whalesay     "bash"                   5 seconds ago       Exited (0) 3 seconds ago                           loving_mayer

なぜ機能しないのでしょうか? どうすれば機能するようになりますか?

ベストアンサー1

docker runtty を接続せずに のみを呼び出すとbash、bash は何もすることがなく終了します。これは、デフォルトではコンテナが非対話型であり、非対話モードで実行されるシェルはスクリプトの実行を期待しているためです。スクリプトが実行されない場合、シェルは終了します。

使い捨ての新しいコンテナを実行するには、tty と標準入力を接続するだけです。

docker run --rm -it --entrypoint bash <image-name-or-id>

または、上記のコンテナが破棄されないようにするには、 なしで実行します--rm

または、実行中のコンテナに入るには、exec代わりに以下を使用します。

docker exec -it <container-name-or-id> bash

コメントで質問がありました

これとの違いは何だかご存知ですかdocker run -it --entrypoint bash docker/whalesay

上記の 2 つのコマンドでは、bashとして指定しています。このコマンドでは、としてCMD指定しています。bashENTRYPOINT

ENTRYPOINTすべてのコンテナは、との組み合わせを使用して実行されますCMD。 を(またはイメージが)指定しない場合ENTRYPOINT、デフォルトのエントリポイントは になります/bin/sh -c

したがって、前の2つのコマンドbashで として実行しCMD、デフォルトENTRYPOINTが使用されると、コンテナは次のように実行されます。

/bin/sh -c bash

を指定すると--entrypoint bash、代わりに実行される

bash <command>

画像内で指定されている場所 (指定されている場合<command>) 。CMD

編集 2024年5月

最近の質問に回答し、もう少し詳細を更新します。ENTRYPOINT と CMD が何であるかをどのようにして知るのですか?

イメージを検査することができます (必要に応じて、jlessまたは などを使用してjqJSON 出力内のものを簡単に見つけることができます)。例:

❯ docker inspect docker/whalesay | jq '.[].Config.Entrypoint,.[].Config.Cmd'
null
[
  "/bin/bash"
]

ここで、 ENTRYPOINT は でありnullCMDは であることがわかります["/bin/bash"]。この場合、Docker はシステム コールを使用して CMD を実行します。

正確な動作はDockerのドキュメントに記載されています。このリンクそこへ移動しますが、リンクは将来変更される可能性があります。

おすすめ記事