ottijp blog

Dockerコンテナにマウントしているホストのファイルをコンテナ内でchownやchmodしたらどうなるか

2022-01-22linuxdocker

環境

  • 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の場合とおんなじ.)

refs


ottijp
Satoshi SAKAO (@ottijp)

都内でアプリケーションエンジニアをしています

...