[解決済み] dockerイメージの新しいコンテナでbashを実行するにはどうすればよいですか?
質問
docker/whalesayイメージから作成したコンテナで、任意のシェルコマンドを実行することができます。
$ docker run docker/whalesay ls -l
total 56
-rw-r--r-- 1 root root 931 May 25 2015 ChangeLog
-rw-r--r-- 1 root root 385 May 25 2015 INSTALL
-rw-r--r-- 1 root root 1116 May 25 2015 LICENSE
-rw-r--r-- 1 root root 445 May 25 2015 MANIFEST
-rw-r--r-- 1 root root 1610 May 25 2015 README
-rw-r--r-- 1 root root 879 May 25 2015 Wrap.pm.diff
drwxr-xr-x 2 root root 4096 May 25 2015 cows
-rwxr-xr-x 1 root root 4129 May 25 2015 cowsay
-rw-r--r-- 1 root root 4690 May 25 2015 cowsay.1
-rw-r--r-- 1 root root 54 May 25 2015 install.pl
-rwxr-xr-x 1 root root 2046 May 25 2015 install.sh
-rw-r--r-- 1 root root 631 May 25 2015 pgp_public_key.txt
$ docker run docker/whalesay lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.2 LTS
Release: 14.04
Codename: trusty
しかし、このイメージから作成したコンテナでシェルを実行することができません。
$ docker run docker/whalesay bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ 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
なぜうまくいかなかったのでしょうか?どうすればうまくいくのでしょうか?
解決するには?
もし、あなたが
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
画像に指定されている場合)。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] Docker Dockerコンテナからホストへのファイルコピー
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み】Dockerは仮想マシンとどう違うの?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Docker ubuntu イメージ - bash: man: コマンドが見つかりません。
-
[解決済み] bashの文字列の等値性テストで、予期しない演算子エラーが発生するのはなぜですか?重複
-
[解決済み] systemd サービス 203/EXEC の失敗 (そのようなファイルやディレクトリがない) を修正する。
-
[解決済み] zip警告 - 名前が一致しない
-
[解決済み] sed で二重引用符と単一引用符をエスケープするにはどうしたらいいですか?
-
[解決済み] cmake execute_process COMMAND [重複]。
-
[解決済み] bashで::演算子は何をするのですか?
-
npm err インストールエラーの解決策
-
[解決済み] ファイル内の大文字・小文字を区別しない文字列を grep するには?
-
[解決済み] Grep 'binary file matches'. どうすれば正常なgrepの出力が得られるか?[重複]する