CMD
Dockerfiles には、とという、似ているように見える 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