无根 Docker:未使用 sudo 时向卷挂载写入文件时出现权限被拒绝的问题

8

我在容器内通过ssh无法在挂载的卷中写入文件,除非拥有sudo权限。挂载的文件夹是主机用户的主文件夹。我正在运行一个无根docker守护程序。

我执行了以下步骤来启动容器:

  1. 按照https://docs.docker.com/engine/security/rootless/上的说明设置了一个无根docker。

  2. 使用以下命令构建Dockerfile(如下):

    docker build --build-arg USER_ID=$(id -u) --build-arg GROUP_ID=$(id -g) --build-arg USER_NAME=user--build-arg USER_PASS=user -t test .

  3. 使用以下命令启动容器:

    docker run -d --name test_container -p 50000:22 -v /home/$(id -u -n):/mnt/home test

  4. 通过以下方式ssh连接到我的容器:

    ssh user@localhost -p 50000

当我在我的主目录中创建一个文件时,会出现权限被拒绝的错误。当我在主机上创建一个新文件夹并将其chmod为777时,我就能够创建文件,但是它们不会以正确的用户/组出现在我的原始主机上,而是出现了以下内容:

drwxrwxrwx  6 gdekkers gdekkers 4096 May 25 21:10 .
drwxr-xr-x 14 gdekkers gdekkers 4096 May 25 21:10 ..
drwxrwxrwx  3 gdekkers gdekkers 4096 Apr 30 13:01 SomeFolder
drwxr-xr-x  2   100999   100999 4096 May 25 21:08 test
drwxr-xr-x  2   100999   100999 4096 May 25 21:10 test2

因为我需要定期应用 chown,所以这很不方便。这似乎与非特权 Docker 使用的名称空间有关。我该如何确保创建的文件匹配我的主机用户?

Dockerfile:

FROM nvidia/cuda:11.2.2-cudnn8-runtime-ubuntu20.04

# Input arguments
ARG USER_ID
ARG GROUP_ID
ARG USER_NAME
ARG USER_PASS

# environment variables
ARG DEBIAN_FRONTEND="noninteractive"
ENV TZ Europe/Belgium

# Install some basic utilities and clean up
RUN apt-get update && apt-get install -y \
    nano \
    ca-certificates \
    sudo \
    libx11-6 \
    openssh-server \
 && rm -rf /var/lib/apt/lists/*

# Create a sudo user
RUN groupadd --gid $GROUP_ID user
RUN useradd -rm -d /home/$USER_NAME -s /bin/bash --uid $USER_ID --gid $GROUP_ID -G sudo $USER_NAME
RUN usermod -aG sudo $USER_NAME
RUN echo $USER_NAME:$USER_PASS | chpasswd

# Start ssh service
RUN service ssh start
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]

感谢您!
1个回答

1
最近在自己的项目中遇到了类似的问题。这是由于在无根 Docker 中使用不同的 UID/GID 映射导致的。
我在我的博客上有一篇最新的文章,详细介绍了如何处理类似这样的“权限被拒绝”问题的rootless Docker 问题。主机上的继承 ACL 是一个可行的解决方案(也在这个 StackOverflow 帖子中提到)。

Start by installing the acl package if you do not already have it installed:

sudo apt install acl

Then let's always allow rwX permissions for current and future files in ./data for the user ubuntu:

sudo setfacl -Rm d:u:ubuntu:rwX,u:ubuntu:rwX ./data
(上述示例假设Docker绑定挂载是./data的子目录)

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