こんにちは。Яeiです。
今回は、現役エンジニアの私がDockerfileのCOPY、ADDの書き方について記事にしようと思います。
どちらもコンテナイメージ作成時にホストOSのファイルをコンテナに配置する命令ですが、使い分けに悩むことも多いので是非、当記事で学んでみて下さい。
当記事は以下の公式リファレンスを元に記載しております。
Dockerfile reference >>
目次
結論: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命令について説明いたしました。内容自体はとても似ているため使い分けに迷う方もいらっしゃると思いますが、これで使い分けに困ることはなくなったと思います。
長々とお疲れさまでした。