Docker容器卷挂载和权限:主机上的www-data(33)变为Alpine Linux上的xfs(33)

8
我在Docker容器中遇到了一个目录挂载问题:

这是一个全栈情况:我正在使用服务堆栈使文件在本地局域网中可用。 堆栈使用nginx:alpine,镜像可用 - 因此我无法轻松修改Dockerimage。

是否有任何方法可以防止Alpine Linux镜像中的xfs获得用户和组ID 33?

我尝试在docker-compose.yml中设置PUID和PGID,但它不起作用(我也很难理解):

services:
celeryworker:
    environment:
      - PUID=33
      - PGID=33

最小可重现示例:

cd /mnt/nfs/folder1
ls -alh
>-rwxr-xr-x 1 www-data www-data 3.5M Sep 21 15:41 '02 - track.mp3'
ls -alhn
>-rwxr-xr-x 1 33 33 3.5M Sep 21 15:41 '02 - track.mp3'
less /etc/passwd | grep www-data
>www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

version: "3"

services:
  celeryworker:
    restart: unless-stopped
    image: funkwhale/funkwhale:1.0.1
    networks:
      - default
    depends_on:
      - postgres
      - redis
    command: celery -A funkwhale_api.taskapp worker -l INFO --concurrency=0
    environment:
      - C_FORCE_ROOT=true
    volumes:
      - "/mnt/nfs/:/music:ro"

docker exec -it funkwhale_celeryworker_1 /bin/bash
cd /music/folder1/
ls -alh
>-rwxr-xr-x    1 xfs      xfs         3.4M Sep 21 13:41 '02 - track1.mp3'
ls -alhn
>-rwxr-xr-x    1 33      33         3.4M Sep 21 13:41 '02 - track1.mp3'
su xfs
>This account is not available
less /etc/passwd | grep xfs
>xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin

1
你能提供一个 [mcve] 吗?文件由 uid 33 拥有是否会出现特定问题?它们在主机上对所有用户可读吗?(如果将文件绑定到容器中,则通常在主机和容器上下文中保持相同的数字用户和组所有者以及其他属性。) - David Maze
抱歉,你是对的,我更新了我的原始帖子。 - Alex
啊,这是我的错误:folder1没有开放给所有用户读取的权限!一旦我使用了chmod 755 folder1,容器内部就授予了权限,即使是用户xfs也可以访问。 - Alex
2个回答

11
晚回复,但也许可以帮助其他人。在Debian/Ubuntu中,www-data的UID:GID与Alpine中的ID不匹配:
用户 : 组 Debian/Ubuntu (uid:gid) Alpine (uid:gid)
www-data : www-data 33 : 33 82 : 82
xfs : xfs - 33 : 33
如果您的主机文件夹归属于www-data:www-data33:33),则在Alpine容器内,该uid:gid将与xfs:xfs的uid:gid匹配,并且您将遇到权限问题。
为解决此问题,您可以将主机上的所有权更改为82:82:
$ sudo chown -R 82:82 host_directory

谢谢。是的,在主机上更改权限为全局可读或拥有权是唯一的解决方案。我原以为有些事情只需要在docker容器中就能解决。不管怎样,现在它有效了! - Alex
1
我对这被标记为解决方案感到不满。通常情况下,如果主机上的文件由 www-data 拥有,那么肯定是有原因的,例如它们是通过 Nextcloud 等方式进行管理的。如果您更改主机上的权限以匹配容器中所需的权限,则 Nextcloud 将无法再访问它们。因此,数据在容器外部就没有用处了,那么您可以将它们存储在 Docker 卷中。 - mcnesium
您可以修改图像以更改运行容器的用户/组。是的,大多数情况下Docker卷是更好的选择。 - rtribaldos
我不同意,Docker 卷通常只适用于快速测试。任何持久性的东西都应该与您的个人文件夹/文件流集成。顺便说一下,我最终通过嵌套用户映射解决了问题:我的文件是使用 LXC UID 映射(www-data -> 82:82 在 LXC 中 -> Alpine Docker 中的 www-data)从 Hypervisor 绑定挂载的。不幸的是,这在 Proxmox 之外不适用。 - Alex

1

更多细节和不同解决方案,请参见此Gist


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接