DockerfileのADDとCOPY、CMDとENTRYPOINTの違いを整理
- 2020.09.05
- Docker
最近、Dockerfileを書く機会が多いのですが、ADDとCOPY、CMDとENTRYPOINTの違いを自分の中でも曖昧な状態で放置していたので、この機会にまとめておきたいと思います。
ADDとCOPYの違い
結論から言うと、以下の違いがあります。
ADD | COPY | |
リモートからのファイル追加 | できる | できない |
圧縮ファイルの自動解凍 | される | されない |
ここで言うリモートからのファイル追加というのは、例えばGitHubのリポジトリからファイルを引っ張ってくるケース等です。
CMDとENTRYPOINTの違い
それぞれ単独で使った場合
以下のような違いがあります(表にする必要なかったかも)。
CMD | ENTRYPOINT | |
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の部分にデフォルトの引数などを定義するというのが一般的な使い方のようです。
-
前の記事
CodeBuildでクロスアカウントのs3にアクセスする 2020.09.05
-
次の記事
Cognitoの未認証ユーザの機能をAPI Gatewayで使用(Node.js) 2020.09.06