【保存版】DockerfileのCOPY、ADDの書き方

こんにちは。Яeiです。

今回は、現役エンジニアの私がDockerfileのCOPY、ADDの書き方について記事にしようと思います。

どちらもコンテナイメージ作成時にホストOSのファイルをコンテナに配置する命令ですが、使い分けに悩むことも多いので是非、当記事で学んでみて下さい。

MEMO

当記事は以下の公式リファレンスを元に記載しております。

Dockerfile reference >>

https://docs.docker.com/engine/reference/builder/#copy

スポンサーリンク



結論:COPY、ADD の書き方

COPY の基本的な使い方は以下になります。

COPY [–chown=<user>:<group>] [–chmod=<perms>] <src>… <dest>

ADD の基本的な使い方は以下になります。

ADD [–chown=<user>:<group>] [–chmod=<perms>] [–checksum=<checksum>] <src>… <dest>

スポンサーリンク



詳細:COPY、ADDの使い方

COPY、ADD の使い方

COPY [–chown=<user>:<group>] [–chmod=<perms>] <src>… <dest>

or
COPY [–chown=<user>:<group>] [–chmod=<perms>] [“<src>”,… “<dest>”]

ADD [–chown=<user>:<group>] [–chmod=<perms>] [–checksum=<checksum>] <src>… <dest>

or
ADD [–chown=<user>:<group>] [–chmod=<perms>] [“<src>”,… “<dest>”]

見比べて頂いて分かると思いますが、とても良く似たコマンドです。

どちらもコンテナイメージ作成時にホストOSからコンテナにファイルを配置するコマンドになります。基本的にはCOPYを使えば良いと覚えておいて、以下のケースの場合のみADDを使うと覚えておけば良いでしょう。

コピー対象がURLまたはtarアーカイブで、コンテナに配置する際に解凍したい場合はADD命令

これだけです。

キャッシュ的にもCOPYの方がキャッシュ利用されるのでビルドが速くなるメリットもありますので、コンテナ配置時に解凍したい場合のみADDを使えば良いことでしょう。

使い方サンプル(COPY)

一番シンプルな記述は以下の通りです。

FROM python:latest

COPY ./testfile.txt /

ホストOS(docker コマンドを入力するPC)に配置されたtestfile.txtをコンテナ内の / にコピーします。

> docker container run --rm -it test bash
root@a4d4fba8dcea:/# cat testfile.txt
I'm "testfile.txt"!

ここで注意事項としてはパーミッションと所有者は以下のようになっていることです。

# ls -ltr /testfile.txt
-rwxr-xr-x 1 root root 19 Aug 4 11:13 /testfile.txt

権限(パーミッション)はデフォルトだと以下の通りとなります。

所有者はread+write+execute
グループはread+execute
その他はexecute

また、所有者はrootであることが分かります。しかし、多くのアプリケーションではroot起動しませんし、パーミッションももしかしたらデフォルトだと問題となることもあるかもしれません。

そこで、権限を変えたいときは–chmod、所有者を変えたいときは–chownを利用します。

今度は以下のようにDockerfileを修正してみます(所有者はすでに作成されているのでとりあえずdaemon、権限はexecuteをはく奪する)。

FROM python:latest

COPY --chown=daemon:daemon --chmod=644 ./testfile.txt /

すると結果は以下のようになりました。

# ls -ltr testfile.txt
-rw-r--r-- 1 daemon daemon 19 Aug 4 11:13 testfile.txt

使い方サンプル(ADD)

ADDは実は先ほど説明したCOPYと全く同じ使い方になります。そのため、

FROM python:latest

ADD --chown=daemon:daemon --chmod=644 ./testfile.txt /

とすれば、結果は

# ls -ltr testfile.txt
-rw-r--r-- 1 daemon daemon 19 Aug 4 11:13 testfile.txt

となります。ADDがCOPYと異なる点は

コピー対象がURLまたはtarアーカイブで、コンテナに配置する際に解凍したい場合はADD命令

でしたね。

FROM python:latest

ADD --chown=daemon:daemon --chmod=644 ./test.tar /

これはコンテナでどうなるかというと以下のように解凍されて配置されます。

# ls -ltr / | grep test
drwxrwxrwx 2 root root 4096 Aug 4 11:33 test
/# ls -ltr /test
-rw-rw-rw- 1 root root 0 Aug 4 11:33 test2.txt
-rw-rw-rw- 1 root root 0 Aug 4 11:33 test1.txt

test.tar ファイルもコンテナ内に残ることもありません。ちなみに、ADDをCOPYに変更するとどうなるでしょうか。

FROM python:latest

COPY --chown=daemon:daemon --chmod=644 ./test.tar /

結果はもちろん以下の通りとなります。

# ls -ltr / | grep test
-rw-r--r-- 1 daemon daemon 2560 Aug 4 11:33 test.tar

スポンサーリンク



当記事は以上となります。

今回は COPY、ADD命令について説明いたしました。内容自体はとても似ているため使い分けに迷う方もいらっしゃると思いますが、これで使い分けに困ることはなくなったと思います。

長々とお疲れさまでした。

スポンサーリンク



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA