発生した問題
bytemark/webdavを使ってdocker-composeで構築したWebDavのファイルをSamba経由で更新したい要件があったのでdperson/sambaを追加し、ホストの同じディレクトリを双方にマウントしました。
しかし、WebDavで追加したファイルをSambaで変更・削除しようとすると権限が無いというエラーが発生しました。
原因
WebDavにファイルを追加するとサーバーにはパーミッション644でファイルが作成されます。
また、Sambaにファイル追加するとサーバーにはパーミッション664でファイルが作成されます。
WebDavとSambaは実行ユーザーが異なりファイルの所有者が違うため、お互い相手が追加したファイルの書き込みが出来ません。
対応
WebDavの実行ユーザーのUIDをSambaの実行ユーザーのUIDに変更して、ファイルの所有者を無理やり同じにします。
まず、WebDavのコンテナIDを確認します。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[コンテナID] bytemark/webdav "docker-entrypoint.s…" About an hour ago Up About an hour 443/tcp, 0.0.0.0:8882->80/tcp, :::8882->80/tcp hoge_webdav_1
WebDavの実行ユーザーを確認します。
$ docker exec -it [コンテナID] cat /usr/local/apache2/conf/httpd.conf | grep ^User
User www-data
WebDavの実行ユーザーは www-data であることがわかりました。
WebDavのpasswdファイルをホスト側にコピーしておきます。
$ docker cp [コンテナID]/etc/passwd ./hoge
続いて、Sambaの実行ユーザーとそのUIDを確認します。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[コンテナID] dperson/samba "/sbin/tini -- /usr/…" About an hour ago Up About an hour 0.0.0.0:139->139/tcp, :::139->139/tcp, 0.0.0.0:137-138->137-138/udp, :::137-138->137-138/udp, 0.0.0.0:445->445/tcp, :::445->445/tcp hoge_samba_1
$ docker exec -it [コンテナID] cat /etc/passwd | grep ^smbuser
smbuser:x:100:101:Samba User:/tmp:/sbin/nologin
Sambaの実行ユーザーのUIDは 100 であることがわかりました。
先程コピーしておいた passwd ファイルの www-data の行のUIDを100に書き換えます。
www-data:x:82:82:Linux User,,,:/home/www-data:/bin/false
↓
www-data:x:100:82:Linux User,,,:/home/www-data:/bin/false
もし100のUIDがすでに使用されていた場合はhttpd.confを書き換えてApacheの実行ユーザーを変えることになると思います(未検証)
このpasswdファイルをdocker-compose.ymlに定義してマウントします。
docker-compose.ymlの全体は以下の通りです。
version: '3'
services:
webdav:
image: bytemark/webdav
restart: always
ports:
- "80:80"
environment:
AUTH_TYPE: Digest
USERNAME: hoge
PASSWORD: fuga
LOCATION: /hoge
volumes:
- ./hoge/dav:/var/lib/dav
- ./hoge/zdav.conf:/usr/local/apache2/conf/conf-enabled/zdav.conf
- ./hoge/passwd:/etc/passwd
samba:
image: dperson/samba
ports:
- "137:137/udp"
- "138:138/udp"
- "139:139/tcp"
- "445:445/tcp"
volumes:
- ./hoge/dav/data:/mnt/hoge:rw
command:
-s "hoge;/mnt/hoge;yes;no;yes;all;none"
restart: unless-stopped
zdav.confファイルはこちらを参照して下さい。