CMD
とRUN
をいつ使うべきかについて混乱しています。たとえば、bash/Shellコマンド(つまりls -la
)を実行するには、常にCMD
を使用するのでしょうか、それともRUN
を使用するのでしょうか。これら2つの似たDockerfile
ディレクティブに関するベストプラクティスを理解しようとしています。
RUN はイメージ構築ステップです。RUN
コマンドの後のコンテナの状態はdockerイメージにコミットされます。 Dockerfileには、イメージを構築するために互いの上に重なる多くのRUN
ステップを含めることができます。
CMD は、ビルドされたイメージを起動したときにデフォルトでコンテナが実行するコマンドです。 DockerfileはCMD
を1つだけ持つことができます。 docker run $image $other_command
を指定してコンテナーを起動すると、CMD
をオーバーライドできます。
ENTRYPOINT もCMD
と密接に関係しており、コンテナがイメージを開始する方法を変更することができます。
RUN - dockerイメージを構築している間にコマンドがトリガーされます。
CMD - 作成したdockerイメージを起動している間にコマンドが起動します。
私はこれらの違いを理解するのに非常に役立つ この 記事を見つけました:
RUN - RUN命令を使用すると、アプリケーションとそれに必要なパッケージをインストールできます。現在の画像の上でコマンドを実行し、結果を確定することによって新しいレイヤーを作成します。多くの場合、Dockerfileに複数のRUN命令があります。
CMD - CMD命令を使用すると、デフォルトのコマンドを設定できます。デフォルトのコマンドは、コマンドを指定せずにcontainerを実行した場合にのみ実行されます。 Dockerコンテナーがコマンドで実行されている場合、デフォルトのコマンドは無視されます。 Dockerfileに複数のCMD命令がある場合、最後以外のすべて
CMD命令は無視されます。
注:RUNとCMDを混同しないでください。 RUNは実際にコマンドを実行して結果をコミットします。 CMDはビルド時には何も実行しませんが、イメージに対して意図したコマンドを指定します。
dockerファイル参照から
RUN - Pythonをインストールすると、コンテナーにpythonがイメージに焼き付けられています。
CMD - python hello.py、お気に入りのスクリプトを実行してください。
RUNコマンド:RUNコマンドは基本的に、イメージを構築しているときにデフォルトのコマンドを実行します。また、次のステップのために画像の変更を確定します。
新しいイメージを作成するプロセスを支援するために、複数のRUNコマンドがある場合があります。
CMDコマンド:CMDコマンドは新しいコンテナにデフォルトのコマンドを設定するだけです。これはビルド時には実行されません。
Dockerファイルに複数のCMDコマンドがある場合、最後のものを除いてそれらのすべてが無視されます。このコマンドは何も実行しないので、デフォルトのコマンドを設定するだけです。