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 run
tty を接続せずに のみを呼び出すと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
指定しています。bash
ENTRYPOINT
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
または などを使用してjq
JSON 出力内のものを簡単に見つけることができます)。例:
❯ docker inspect docker/whalesay | jq '.[].Config.Entrypoint,.[].Config.Cmd'
null
[
"/bin/bash"
]
ここで、 ENTRYPOINT は でありnull
、CMD
は であることがわかります["/bin/bash"]
。この場合、Docker はシステム コールを使用して CMD を実行します。
正確な動作はDockerのドキュメントに記載されています。このリンクそこへ移動しますが、リンクは将来変更される可能性があります。