Dockerfile の CMD と ENTRYPOINT の違いは何ですか? 質問する

Dockerfile の CMD と ENTRYPOINT の違いは何ですか? 質問する

CMDDockerfiles には、とという、似ているように見える 2 つのコマンドがありますENTRYPOINT。しかし、それらの間には (微妙な?) 違いがあると思います。そうでなければ、まったく同じことに対して 2 つのコマンドを使用するのは意味がありません。

ドキュメントには次のように記載されていますCMD-

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

そしてENTRYPOINT

ENTRYPOINT は、実行可能ファイルとして実行できるコンテナーを構成するのに役立ちます。

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

ベストアンサー1

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

docker を次のように実行する場合、docker run -i -t ubuntu bashエントリポイントは default /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 DockerファイルデフォルトCMDが指定されています:
CMD ["bash"]

すべてがエントリポイントに渡されるので、イメージから非常に優れた動作を得ることができます。 @Jiri の例は優れており、イメージを「バイナリ」として使用する方法を示しています。 を["/bin/cat"]エントリポイントとして使用して を実行するとdocker run img /etc/passwd、 がコマンドになり/etc/passwd、 がエントリポイントに渡されるため、最終結果の実行は単純に になります/bin/cat /etc/passwd

もう 1 つの例としては、任意の cli をエントリポイントとして持つことが挙げられます。たとえば、redis イメージがある場合は、 を実行する代わりに、 を指定してから次のように実行するだけで、同じ結果を得ることdocker run redisimg redis -H something -u toto get keyができますENTRYPOINT ["redis", "-H", "something", "-u", "toto"]docker run redisimg get key

おすすめ記事