【问题标题】:Docker writting permission deniedDocker写权限被拒绝
【发布时间】:2021-11-05 05:30:43
【问题描述】:

我正在尝试使用 docker 运行一个简单的命令,该命令读取我的主目录中的一个文件,并在我的本地机器上的同一目录中写入一个输出文件 (/home/userxyz/projects/data)。 data 文件夹属于我 (userxyz) 和我的同名 (userxyz) 组,具有 R/W 权限。

我用这样的 Dockerfile 构建了一个映像(遵循How to add users to Docker container?):

FROM osgeo/gdal:alpine-small-latest

RUN mkdir /usr/tmp

RUN addgroup -S userxyz \
  && adduser -S -D -h /usr/tmp userxyz userxyz \
  && chown -R userxyz:userxyz /usr/tmp

USER userxyz

WORKDIR /usr/tmp

和:

docker build -t userxyz/test .

我用以下方式运行 docker:

docker run --rm -v /home/userxyz/projects/data:/usr/tmp userxyz/test gdal_translate -ot UInt32 /usr/tmp/input.tif /usr/tmp/output.tif

但是,我仍然得到:

ERROR 4: Attempt to create new tiff file `/usr/tmp/output.tif' failed: Permission denied

当我只读取文件时它可以工作:

docker run --rm -v /home/userxyz/projects/data:/usr/tmp userxyz/test gdalinfo /usr/tmp/input.tif

知道写权限有什么问题吗?

编辑:当打开数据文件夹以读取/写入“其他”时,该文件是由user#500100 正确创建的,所以我猜它与用户名归属有关?如何使文件由userxyz 而不是user#500100 创建?

【问题讨论】:

    标签: docker


    【解决方案1】:

    您必须根据组 ID 而不是组名将用户添加到您的组中。用户和组名在容器中是隔离的,所以它不起作用。

    您可以在 /etc/group 文件中找到组 ID,在主机上使用以下命令:

    cat /etc/group | grep userxyz
    

    找到后,将用户添加到 Dockerfile 中的组中:

    FROM osgeo/gdal:alpine-small-latest
    
    RUN mkdir /usr/tmp
    
    RUN groupadd -g $GID userxyz \
      && adduser -S -D -h /usr/tmp userxyz userxyz \
      && chown -R userxyz:userxyz /usr/tmp
    
    USER userxyz
    
    WORKDIR /usr/tmp
    

    用组 ID 替换 $GID

    【讨论】:

      【解决方案2】:

      虽然您在 Dockerfile 中使用userxyz:userxyz 设置了相同的用户和组,但主机 rootfs 和容器 rootfs 是 2 个不同的 rootfs。这意味着相同用户名/组名的UIDGID 仍然不同。

      结果,只复制usernamegroupname是不够的,还需要复制UIDGID,类似next:

      Dockerfile:

      FROM ubuntu:16.04
      
      ARG UID
      ARG GID
      
      RUN groupadd -g $GID userxyz
      RUN useradd -m -u $UID -g $GID -s /bin/bash userxyz
      

      构建命令:

      docker build -t abc:1 --build-arg UID=`id userxyz -u` --build-arg GID=`id userxyz -g` .
      

      说明:

      id userxyz -u & id userxyz -g 获取主机上的 UID/GID,并将它们传递给构建容器,然后docker build 使用它们为userxyz 设置与主机相同的 UID/GID。这将确保您在容器中拥有与主机相同的权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 2020-08-31
        • 2022-01-18
        • 2021-04-12
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多