1. ホーム
  2. bash

[解決済み] dockerイメージの新しいコンテナでbashを実行するにはどうすればよいですか?

2022-03-03 06:49:17

質問

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 . このコマンドで指定しているのは bashENTRYPOINT .

すべてのコンテナは、以下の組み合わせで実行されます。 ENTRYPOINTCMD . もし、あなた(または画像)が ENTRYPOINT であり、デフォルトのエントリーポイントは /bin/sh -c .

つまり、先の2つのコマンドで、もし bashCMD と、デフォルトの ENTRYPOINT を使用した場合、コンテナの実行は

/bin/sh -c bash

を指定した場合 --entrypoint bash の代わりに、次のように実行されます。

bash <command>

ここで <command>CMD 画像に指定されている場合)。