はじめに
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もそのうち追加されるかもしれないですね。