1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker-composeでwebdavとsambaの両方から同じファイルに書き込む

Last updated at Posted at 2021-08-13

発生した問題

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の全体は以下の通りです。

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ファイルはこちらを参照して下さい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?