1. ホーム
  2. docker

[解決済み] DockerfileのCMDとENTRYPOINTの違いは何ですか?

2022-03-14 17:08:21

質問

Dockerfilesの中で、私には似たようなコマンドが2つあります。 CMDENTRYPOINT . しかし、この2つの間には(微妙な)違いがあるのでしょう。そうでなければ、まったく同じものに対して2つのコマンドを用意する意味がありません。

ドキュメントでは CMD

CMDの主な目的は、実行中のコンテナにデフォルトを提供することです。

ENTRYPOINT :

ENTRYPOINTは、実行ファイルとして実行可能なコンテナを設定するのに役立ちます。

では、この2つのコマンドは何が違うのでしょうか?

解決方法は?

Dockerは、デフォルトのエントリーポイントとして /bin/sh -c が、デフォルトのコマンドはありません。

このようにdockerを実行すると docker run -i -t ubuntu bash は、エントリーポイントがデフォルトの /bin/sh -c の場合、画像は ubuntu で、コマンドは bash .

コマンドはエントリーポイント経由で実行されます。つまり、実際に実行されるのは /bin/sh -c bash . これによってDockerは RUN シェルのパーサーに依存することで、素早く

その後、これをカスタマイズできるようにしたいという要望があり、そのため ENTRYPOINT--entrypoint が紹介されました。

画像名以降の全て。 ubuntu はコマンドで、エントリーポイントに渡されます。を使用する場合は CMD を実行しているのと全く同じです。
docker run -i -t ubuntu <cmd>
エントリーポイントのパラメータは <cmd> .

また、次のコマンドを入力しても、同じ結果になります。 docker run -i -t ubuntu : コンテナ内で bash シェルが起動します。 ubuntu Dockerfile デフォルトの CMD が指定されます。
CMD ["bash"] .

すべてがエントリポイントに渡されるため、画像から非常に優れた動作をさせることができます。Jiriの例はよくできていて、画像を"binary"として使用する方法を示しています。この例では、画像をバイナリとして使用する方法を示しています。 ["/bin/cat"] をエントリーポイントとして使用し docker run img /etc/passwd は、それを得ることができます。 /etc/passwd はコマンドで、エントリポイントに渡されるため、最終的な実行は単純に /bin/cat /etc/passwd .

もう一つの例は、任意のcliをエントリポイントにすることである。たとえば、redis イメージがある場合、代わりに docker run redisimg redis -H something -u toto get key を使えば、単純に ENTRYPOINT ["redis", "-H", "something", "-u", "toto"] というように実行しても、同じ結果になります。 docker run redisimg get key .