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


123

エントリポイントとcmdの両方を指定して、他の人が作成したdockerイメージを検査したい。たとえば:

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

私は現在:

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

空にするためにCMDをオーバーライドする方法はありますか(したがって、「-login」を使用する必要はありません)?

回答:


126

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

次に、実行中のコンテナを、実行中の状態で検査できます。

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

docker exec -it $CONTAINER_ID /bin/bash

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


それは「/ usr / sbin / apache2ctl / bin / bash」を実行しませんか?(あなたの例はエントリポイントをオーバーライドしないので、Dockerfileで定義されたエントリポイントを使用します-または何か不足していますか?)
ワープ

それはおそらく古い/新しいドッカーバージョンで異なるものですか?それは確かにエントリポイントgist.github.com/warpr/26a5cc471dce7fcf9021を実行します。これはUbuntu 13.10でdocker 0.10.0を使用しています。
ワープ

4
--entrypointを渡すとエントリポイントが上書きされることは知っています。しかし、--entrypointを使用する場合、CMDを空にするにはどうすればよいですか?(bashには-iや--loginのようなものを使用できますが、使用したいすべてのエントリポイントに同等の「ダミー」引数があるわけではありません)。
ワープ

1
少なくともDocker v1.11.1では、-entrypointをオーバーライドすると、エントリポイントへのCMDの通常の追加も妨げられるようです。これは、エントリポイントがオーバーライドされていない場合にのみ発生するようです。
ジャスミンヘグマン

1
なぜ-i後があるの$IMAGEですか?
エアルレビン

27

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

関連部分:

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

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

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

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

したがって、必要なことを行うには、cmdを指定し、を使用してオーバーライドするだけ/bin/bashです。まったく「空」ではありませんが、99%の仕事を成し遂げます。


おっと、詳細を見落としていました。短縮--loginする-lことを除けば、あなたのソリューションはすでにそれと同じくらい良いものだと思います。
サイモントム14年

今日私が見た楽しいことは次のとおりです。コマンドはオーバーライドされず、追加されます。これがコンテナ内部のPSです。追加したコマンドはecho "dbのセットアップ"であり、組み込みコマンドは/ usr / bin / gethです。また、エントリポイントを「」に設定します。1 ? Ssl 0:00 /usr/bin/geth echo setting up db
ポールS

Docker参照リンクは機能しなくなりました-明らかな代替品を見つけることができません。
クリス・アキンプトン

私はちょうどそれを修正しましたが、見つけにくいこともわかりました;(
サイモンThum

15

ここに来てエントリポイントとコマンドをオーバーライドして他のコマンドを渡すようにする人のために、たとえばエントリポイントスクリプトの代わりに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用で、他の画像の場合がほとんどです。


1
ちょうどaddtionシェルコマンドは、ベースWRITENをJSONしなければならないので、代わりに単一引用符でクォートするには、'...'二重引用符を使用"..."
ジミーObonyo ABOR

または、必要な数だけ--entrypoint引数を渡します
Nick Roz

これは機能していないようです:「exec:\ "-c \":$ PATHに実行ファイルが見つかりません」:不明。
リチャード

コンテナ内のパスを確認してください。実際には存在しない可能性があります。ほとんどの画像にはありますが/bin/sh、あなたのものはそうではないかもしれません。
infro
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.