web-dev-qa-db-ja.com

Dockerイメージの実行時にCMDをオーバーライドするにはどうすればよいですか?

エントリーポイントとcmdの両方を指定して、他の誰かが作成したDockerイメージを検査したいと思います。次に例を示します。

ENTRYPOINT ["/usr/sbin/Apache2ctl"]
CMD ["-D", "FOREGROUND"]

私は現在します:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

CMDを空に上書きする方法はありますか( "--login"を使用する必要がないため)?

146
warp

単にdocker run -it --entrypoint=/bin/bash $IMAGE -iを介して入力し(イメージから新しいコンテナーを起動し、インタラクティブモードでbashシェルを取得します)、そのコンテナーでentrypointコマンドを実行します。

次に、実行しているはずの状態で実行中のコンテナーを検査できます。

編集:Docker 1.3以降では、execを使用して、実行中のコンテナーでプロセスを実行できます。通常どおりコンテナーを起動し、次のコマンドを入力してコンテナーを入力します。

docker exec -it $CONTAINER_ID /bin/bash

Bashがインストールされていると仮定すると、実行中のコンテナーへのシェルアクセスが与えられます。

参照: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

関連部分:

CMD(デフォルトのコマンドまたはオプション)Dockerコマンドラインでオプションのコマンドを呼び出します。

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

IMAGEを作成したユーザーが、Dockerfile CMDを使用してデフォルトのコマンドをすでに提供している場合があるため、このコマンドはオプションです。オペレーター(イメージからコンテナーを実行する人)は、新しいコマンドを指定するだけでそのCMDをオーバーライドできます。

画像がENTRYPOINTも指定している場合、CMDまたはCOMMANDが引数としてENTRYPOINTに追加されます。

したがって、必要なことを行うにはonlyコマンドを指定し、/bin/bashを使用してオーバーライドします。まったく「空」ではありませんが、仕事が99%完了します。

31
Simon Thum

ここに来て、エントリポイントANDコマンドをオーバーライドして他のコマンドを渡すために、たとえばエントリポイントスクリプトの代わりにbashを実行してから、パラメーターを指定して他のコマンドを実行します(他の回答からはわかりません)。

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...'/bin/shのパラメーターなので、ここで、コンテナーで実行するコマンドを渡すことができます。 /bin/shはアルパイン画像用、/bin/bashは他の画像用と考えられます。

20
infro