DockerfileのADDとCOPY、CMDとENTRYPOINTの違いを整理

NO IMAGE

最近、Dockerfileを書く機会が多いのですが、ADDとCOPY、CMDとENTRYPOINTの違いを自分の中でも曖昧な状態で放置していたので、この機会にまとめておきたいと思います。

ADDとCOPYの違い

結論から言うと、以下の違いがあります。

ADDCOPY
リモートからのファイル追加できるできない
圧縮ファイルの自動解凍されるされない

ここで言うリモートからのファイル追加というのは、例えばGitHubのリポジトリからファイルを引っ張ってくるケース等です。

CMDとENTRYPOINTの違い

それぞれ単独で使った場合

以下のような違いがあります(表にする必要なかったかも)。

CMDENTRYPOINT
docker run時の上書きできるできない

少し解説します。
以下のようにプロセスの実行にCMDを使用したDockerfileをビルドした場合を考えます。

FROM alpine

CMD ["ping","127.0.0.1"]

この時、以下のようにdocker runの引数を指定することで、CMDで書かれた内容を上書きすることができます。以下の場合、CMDで指定したpingコマンドではなく、引数で指定したコマンドが実行されます。

docker run (ビルドしたイメージ名) (実行したいコマンド)

一方で、プロセスの実行にENTRYPOINTを使用した場合は、コマンドを上書きすることはできません(正確には、ENTRYPOINTで指定したコマンドの引数として渡されます)。
※ docker run –entrypoint=”” と書けばコマンド全体を上書き可能です。

併用した場合

CMDとENTRYPOINTを併用した場合、CMDで指定した内容がENTRYPOINTの引数として渡されます。
例えば、以下のように記載することで「ping 127.0.0.1」が実行されます。

FROM alpine

ENTRYPOINT ["ping"]
CMD ["127.0.0.1"]

実際には、こちらの併用するパターンを使って、ENTRYPOINTには基本的に書き替える必要のない部分を定義しておき、CMDの部分にデフォルトの引数などを定義するというのが一般的な使い方のようです。