docker
dockerfile

Docker 17.09 からADD/COPY --chownでファイルのオーナーを変更できるようになった

More than 1 year has passed since last update.

はじめに

Docker 17.09から ADD/COPY --chownでファイルのオーナーを変更できるようになったようです。
root以外でコンテナを動かしたりするときに地味にうれしい機能。

まぁなくても追加でRUN chownすればいいだけで困りはしないが、あるとDockerイメージのレイヤが1枚減るので地味にうれしい。

moby/moby: Add --chown flag to ADD/COPY commands

というわけで、さっそく試してみた。

稼働確認

稼働確認したバージョンは以下のとおり。

$ docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.9
 Git commit:   afdb6d4
 Built:        unknown-buildtime
 OS/Arch:      darwin/amd64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:45:38 2017
 OS/Arch:      linux/amd64
 Experimental: false

サンプルで適当なDockerfileを準備する。

FROM alpine

RUN addgroup -S app && adduser -S -g app app
COPY --chown=app:app test.txt /tmp/test.txt

ここでは、alpineベースでappというグループとユーザを追加し、test.txt をCOPYしている。
COPY --chown=app:app でオーナーのユーザとグループを指定するのがポイント。

稼働確認のためコピーしている text.txt を適当にローカルに作る。

$ echo "chown test" > test.txt

ビルドしてみる。

$ docker build -t chown-test ./
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM alpine
 ---> 4a415e366388
Step 2/3 : RUN addgroup -S app && adduser -S -g app app
 ---> Running in 81e187e57527
 ---> 8db2e92a0c06
Removing intermediate container 81e187e57527
Step 3/3 : COPY --chown=app:app test.txt /tmp/test.txt
 ---> d5e26892a07e
Successfully built d5e26892a07e
Successfully tagged chown-test:latest

コンテナを実行してオーナーを確認してみる。

$ docker run -it chown-test ls -la /tmp
total 12
drwxrwxrwt    2 root     root          4096 Oct 15 06:34 .
drwxr-xr-x   27 root     root          4096 Oct 15 06:35 ..
-rw-r--r--    1 app      app             11 Oct 15 06:34 test.txt

ちゃんとオーナー設定されてる。よさげ。
上の例は COPY だけど試してみたところ ADD でも動いた。
あと試してみたところディレクトリがある場合も、 chown -R 相当で再帰的にサブディレクトリのファイルのオーナーも変わってたので、大量のファイルをまとめてCOPYする場合でも大丈夫。

おわりに

COPYと同時にchownできるとイメージのレイヤが1枚減って地味にうれしい。

ちなみにchmodもないの?って思って調べたらIssueは立ってて、

moby/moby: Proposal: Add --chmod flag to ADD/COPY commands (analogous to --chown)

これを書いてる現在(2017/10/15)は検討中のようです。chmodもそのうち追加されるかもしれないですね。