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

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

他のユーザーが作成した、エントリポイントと cmd の両方を指定して Docker イメージを検査したいとします。例:

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

現在、私は以下を行っています:

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

CMD を空にオーバーライドする方法はありますか (つまり、「--login」を使用する必要がない)?

答え1

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

その後、実行中のコンテナを、実行されるべき状態で検査できます。

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

docker exec -it $CONTAINER_ID /bin/bash

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

答え2

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

関連部分:

CMD (デフォルトのコマンドまたはオプション) Docker コマンドラインのオプションの COMMAND を思い出してください。

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

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

イメージで ENTRYPOINT も指定されている場合は、CMD または COMMAND が ENTRYPOINT の引数として追加されます。

だから、あなたがやりたいことをするにはのみcmd を指定し、 を使用してオーバーライドします/bin/bash。完全に「空」ではありませんが、99% の作業が完了します。

答え3

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

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

-c 'npm link ...'は のパラメーターなので/bin/sh、ここではコンテナーで実行する任意のコマンドを渡すことができます。/bin/shは alpine イメージ用ですが、/bin/bashおそらく他のイメージ用です。

関連情報