Posted at

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