【问题标题】:Docker volume mount and permissions: www-data on host (33) becomes xfs (33) in Alpine LinuxDocker 卷挂载和权限:主机 (33) 上的 www-data 在 Alpine Linux 中变为 xfs (33)
【发布时间】:2021-06-05 00:01:41
【问题描述】:

我在 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
码头工人-compose.yml
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

【问题讨论】:

  • 你能提供一个minimal reproducible example吗? uid 33 拥有的文件是否存在特定问题?它们在主机上是世界可读的吗? (如果您将文件绑定挂载到容器中,它们通常会在主机和容器上下文中保持相同的 numeric 用户和组所有者以及其他属性。)
  • 道歉,你说得对,我更新了我原来的帖子。
  • 啊,这是我的错误:folder1 不是世界可读的!一旦我使用了 chmod 755 folder1,就在容器内授予了权限,即使对于用户 xfs 也是如此。

标签: docker permissions mount


【解决方案1】:

回复较晚,但也许它可以帮助其他人.. Debian/Ubuntu 中 www-data 的 UID:GID 与 Alpine 中的 ID 不匹配:

user : group Debian/Ubuntu (uid:gid) Alpine (uid:gid)
www-data : www-data 33 : 33 82 : 82
xfs : xfs - 33 : 33

如果您的主机文件夹归www-data:www-data (33:33) 所有,那么在 Alpine 容器内,此 uid:gid 将与 xfs:xfs 的 uid:gid 匹配,您将遇到权限问题。

要解决此问题,您可以将主机中的所有权更改为 82:82:

$ sudo chown -R 82:82 host_directory

【讨论】:

  • 谢谢。是的,将权限更改为主机上的世界可读或所有权是唯一的解决方案。我认为我可以对 docker 容器做一些事情来解决这个问题。无论如何,它有效!
  • 我对这被标记为解决方案感到不满。通常主机上的文件归www-data 所有是有原因的,例如,如果它们是通过例如下一个云。如果您更改主机上的权限以匹配容器中所需的权限,则 Nextcloud 将无法再访问它们。因此容器外的数据不再有用了,你也可以将它们存储在 Docker 卷中。
  • 您可以修改映像以更改将运行容器的用户/组。是的,Docker 卷在大多数情况下是更好的选择。
猜你喜欢
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2020-04-27
相关资源
最近更新 更多