Dockerコンテナにマウントしているホストのファイルをコンテナ内でchownやchmodしたらどうなるか
環境
- mac
- macOS 11.6 (Big Sur)
- Docker Desktop 3.6
- Docker Engine - Community 20.10
- linux
- ubuntu 20.04
- Docker Engine - Community 20.10
調べたこと
Dockerコンテナにマウントしているホストのファイルをコンテナ内でchownやchmodしたらどうなるかを, linuxの場合とmac(Docker Desktop)の場合について調べました.
結果
linux
バインド | ボリューム | |
---|---|---|
ファイルのchown | 変わる | 変わる |
ファイルのchmod | 変わる | 変わる |
ディレクトリのchown | 変わる | 変わる |
ディレクトリのchmod | 変わる | 変わる |
mac
バインド | ボリューム | |
---|---|---|
ファイルのchown | 変わらない *1 | - *2 |
ファイルのchmod | 変わる | - *2 |
ディレクトリのchown | 変わらない *1 | - *2 |
ディレクトリのchmod | 変わる | - *2 |
- *1: 拡張ファイル属性に記録される.
- *2: たぶんlinuxと同じ結果なので調べなかった.
ホストOSによって(Docker Desktopを使っている場合は)挙動が違うし,ホストとコンテナで意図しない所有者変更が発生しうるので,基本的にはuidやgidが変わるようなものはバインドマウントしないほうがよさそうです. ボリュームマウントであればDockerの管理下にあり,ホストで直接扱うものではないので,ホストのユーザやグループと一致しないuid,gidになってもよさそうです.
cf. バインドマウントの利用 | Docker ドキュメント
バインドマウントは非常に性能の良いものですが、ただしホストマシンのファイルシステムに依存するものとなり、利用可能な特定のディレクトリ構造に従ったものになります。 今から新たに Docker アプリケーションを開発しようとする場合は、これにかわって 名前つきボリューム の利用を考えてみてください。 バインドマウントを管理するために Docker CLI コマンドを直接利用することはできなくなります。
調査ログ
以下の条件の組み合わせでそれぞれ調べました.
- OS
- linux
- mac (Docker Desktop)
- マウントの種類
- バインド
- ボリューム
- 操作
- ファイルのchown
- ファイルのchmod
- ディレクトリのchown
- ディレクトリのchmod
linux, バインド
ホストの$PWD/hoge
をバインドマウントして,コンテナ内で操作した結果どうなるか試しました.
$ sudo docker run --rm -it -v $PWD/hoge:/hoge busybox
/ # touch hoge/piyo
/ # ls -ld hoge hoge/piyo
drwxr-xr-x 2 root root 4096 Jan 21 16:25 hoge
-rw-r--r-- 1 root root 0 Jan 21 16:25 hoge/piyo
/ # ls -ldn hoge hoge/piyo
drwxr-xr-x 2 0 0 4096 Jan 21 16:25 hoge
-rw-r--r-- 1 0 0 0 Jan 21 16:25 hoge/piyo
/ # exit
$ ls -ld hoge hoge/piyo
drwxr-xr-x 2 root root 4096 Jan 21 16:25 hoge
-rw-r--r-- 1 root root 0 Jan 21 16:25 hoge/piyo
$ ls -ldn hoge hoge/piyo
drwxr-xr-x 2 0 0 4096 Jan 21 16:25 hoge
-rw-r--r-- 1 0 0 0 Jan 21 16:25 hoge/piyo
$ sudo docker run --rm -it -v $PWD/hoge:/hoge busybox
/ # adduser -D cuser
/ # id cuser
uid=1000(cuser) gid=1000(cuser) groups=1000(cuser)
/ # chown cuser hoge hoge/piyo
/ # chmod g+w hoge hoge/piyo
/ # ls -ld hoge hoge/piyo
drwxrwxr-x 2 cuser root 4096 Jan 21 16:25 hoge
-rw-rw-r-- 1 cuser root 0 Jan 21 16:25 hoge/piyo
/ # ls -ldn hoge hoge/piyo
drwxrwxr-x 2 1000 0 4096 Jan 21 16:25 hoge
-rw-rw-r-- 1 1000 0 0 Jan 21 16:25 hoge/piyo
/ # exit
$ ls -ld hoge hoge/piyo
drwxrwxr-x 2 vagrant root 4096 Jan 21 16:25 hoge
-rw-rw-r-- 1 vagrant root 0 Jan 21 16:25 hoge/piyo
$ ls -ldn hoge hoge/piyo
drwxrwxr-x 2 1000 0 4096 Jan 21 16:25 hoge
-rw-rw-r-- 1 1000 0 0 Jan 21 16:25 hoge/piyo
コンテナ内でchown,chmodした結果,ファイル,ディレクトリともに,ホストでもその変更が適用されました. ただし,ユーザ名とuidの対応付けがコンテナとホストで異なるため,コンテナでのオーナ(cuser)とホストでのオーナ(vagrant)が異なって見えるようになりました.
linux, ボリューム
hoge_vol
というボリュームを作成し,コンテナ内で操作した結果どうなるか試しました.
$ sudo docker run --rm -it -v hoge_vol:/hoge busybox
/ # touch hoge/piyo
/ # ls -ld hoge hoge/piyo
drwxr-xr-x 2 root root 4096 Jan 21 16:36 hoge
-rw-r--r-- 1 root root 0 Jan 21 16:36 hoge/piyo
/ # ls -ldn hoge hoge/piyo
drwxr-xr-x 2 0 0 4096 Jan 21 16:36 hoge
-rw-r--r-- 1 0 0 0 Jan 21 16:36 hoge/piyo
/ # exit
$ sudo docker volume inspect hoge_vol
[
{
"CreatedAt": "2022-01-21T16:36:17Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/hoge_vol/_data",
"Name": "hoge_vol",
"Options": null,
"Scope": "local"
}
]
$ sudo ls -ld /var/lib/docker/volumes/hoge_vol/_data /var/lib/docker/volumes/hoge_vol/_data/piyo
drwxr-xr-x 2 root root 4096 Jan 21 16:36 /var/lib/docker/volumes/hoge_vol/_data
-rw-r--r-- 1 root root 0 Jan 21 16:36 /var/lib/docker/volumes/hoge_vol/_data/piyo
$ sudo ls -ldn /var/lib/docker/volumes/hoge_vol/_data /var/lib/docker/volumes/hoge_vol/_data/piyo
drwxr-xr-x 2 0 0 4096 Jan 21 16:36 /var/lib/docker/volumes/hoge_vol/_data
-rw-r--r-- 1 0 0 0 Jan 21 16:36 /var/lib/docker/volumes/hoge_vol/_data/piyo
$ sudo docker run --rm -it -v hoge_vol:/hoge busybox
/ # adduser -D cuser
/ # id cuser
uid=1000(cuser) gid=1000(cuser) groups=1000(cuser)
/ # chown cuser hoge hoge/piyo
/ # chmod g+w hoge hoge/piyo
/ # ls -ld hoge hoge/piyo
drwxrwxr-x 2 cuser root 4096 Jan 21 16:36 hoge
-rw-rw-r-- 1 cuser root 0 Jan 21 16:36 hoge/piyo
/ # ls -ldn hoge hoge/piyo
drwxrwxr-x 2 1000 0 4096 Jan 21 16:36 hoge
-rw-rw-r-- 1 1000 0 0 Jan 21 16:36 hoge/piyo
/ # exit
$ sudo ls -ld /var/lib/docker/volumes/hoge_vol/_data /var/lib/docker/volumes/hoge_vol/_data/piyo
drwxrwxr-x 2 vagrant root 4096 Jan 21 16:36 /var/lib/docker/volumes/hoge_vol/_data
-rw-rw-r-- 1 vagrant root 0 Jan 21 16:36 /var/lib/docker/volumes/hoge_vol/_data/piyo
$ sudo ls -ldn /var/lib/docker/volumes/hoge_vol/_data /var/lib/docker/volumes/hoge_vol/_data/piyo
drwxrwxr-x 2 1000 0 4096 Jan 21 16:36 /var/lib/docker/volumes/hoge_vol/_data
-rw-rw-r-- 1 1000 0 0 Jan 21 16:36 /var/lib/docker/volumes/hoge_vol/_data/piyo
バインドと同じ結果でした.
mac, バインド
$ docker run --rm -it -v $PWD/hoge:/hoge busybox
/ # touch hoge/piyo
/ # ls -ld hoge hoge/piyo
drwxr-xr-x 3 root root 96 Jan 21 16:44 hoge
-rw-r--r-- 1 root root 0 Jan 21 16:44 hoge/piyo
/ # ls -ldn hoge hoge/piyo
drwxr-xr-x 3 0 0 96 Jan 21 16:44 hoge
-rw-r--r-- 1 0 0 0 Jan 21 16:44 hoge/piyo
/ # exit
$ ls -ld hoge hoge/piyo
drwxr-xr-x 3 otti staff 96 Jan 22 01:44 hoge/
-rw-r--r-- 1 otti staff 0 Jan 22 01:44 hoge/piyo
$ ls -ldn hoge hoge/piyo
drwxr-xr-x 3 501 20 96 Jan 22 01:44 hoge/
-rw-r--r-- 1 501 20 0 Jan 22 01:44 hoge/piyo
$ docker run --rm -it -v $PWD/hoge:/hoge busybox
/ # adduser -D cuser
/ # id cuser
uid=1000(cuser) gid=1000(cuser) groups=1000(cuser)
/ # chown cuser hoge hoge/piyo
/ # chmod g+w hoge hoge/piyo
/ # ls -ld hoge hoge/piyo
drwxrwxr-x 3 cuser root 96 Jan 21 16:44 hoge
-rw-rw-r-- 1 cuser root 0 Jan 21 16:44 hoge/piyo
/ # ls -ldn hoge hoge/piyo
drwxrwxr-x 3 1000 0 96 Jan 21 16:44 hoge
-rw-rw-r-- 1 1000 0 0 Jan 21 16:44 hoge/piyo
/ # exit
$ ls -ld hoge hoge/piyo
drwxrwxr-x@ 3 otti staff 96 Jan 22 01:44 hoge/
-rw-rw-r--@ 1 otti staff 0 Jan 22 01:44 hoge/piyo
$ ls -ldn hoge hoge/piyo
drwxrwxr-x@ 3 501 20 96 Jan 22 01:44 hoge/
-rw-rw-r--@ 1 501 20 0 Jan 22 01:44 hoge/piyo
コンテナ内でchown,chmodした結果,ファイル,ディレクトリともに,パーミションは変わりましたが,オーナは変わりませんでした.
ただし,拡張ファイル属性(@
)が追加され,その属性の中にコンテナ内における所有者情報が入っていました.
$ xattr hoge hoge/piyo
hoge: com.docker.grpcfuse.ownership
hoge/piyo: com.docker.grpcfuse.ownership
$ xattr -p com.docker.grpcfuse.ownership hoge hoge/piyo
hoge: {"UID":1000,"GID":0}
hoge/piyo: {"UID":1000,"GID":0}
mac, ボリューム
Docker Desktopが管理するVMの中にファイルが作成されるので,linuxの場合と同様と考え,調査しませんでした. (たぶんlinuxの場合とおんなじ.)