gpt4 book ai didi

linux - 在特定的用户命名空间配置中运行每个 Docker 容器

转载 作者:IT王子 更新时间:2023-10-29 00:38:12 27 4
gpt4 key购买 nike

问题:

我正在尝试以这种方式将目录挂载为 Docker 卷,在容器内创建的用户可以写到该卷中的文件中。同时,该文件应至少对我的用户 lape 在容器外是可读的。

本质上,我需要将用户 UID 从容器用户命名空间重新映射到主机用户命名空间上的特定 UID。

我该怎么做?

我更喜欢这样的答案:

  • 不涉及改变 Docker 守护进程的运行方式;
  • 并允许为每个容器分别配置容器用户命名空间;
  • 不需要重建镜像;
  • 我会接受显示使用 Access Control Lists 的不错解决方案的答案还有;

设置:

这就是可以复制这种情况的方式。

我有我的 Linux 用户 lape,分配给 docker 组,所以我无需 root 即可运行 Docker 容器。

lape@localhost ~ $ id
uid=1000(lape) gid=1000(lape) groups=1000(lape),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),121(lpadmin),131(sambashare),999(docker)

docker 文件:

FROM alpine
RUN apk add --update su-exec && rm -rf /var/cache/apk/*

# I create a user inside the image which i want to be mapped to my `lape`
RUN adduser -D -u 800 -g 801 insider
VOLUME /data

COPY ./entrypoint.sh /entrypoint.sh
ENTRYPOINT ["sh", "/entrypoint.sh"]

入口点.sh:

#!/bin/sh
chmod 755 /data
chown insider:insider /data

# This will run as `insider`, and will touch a file to the shared volume
# (the name of the file will be current timestamp)
su-exec insider:insider sh -c 'touch /data/$(date +%s)'

# Show permissions of created files
ls -las /data

构建后:

docker build -t nstest

我运行容器:

docker run --rm -v $(pwd)/data:/data nstest

输出如下:

total 8
4 drwxr-xr-x 2 insider insider 4096 Aug 26 08:44 .
4 drwxr-xr-x 31 root root 4096 Aug 26 08:44 ..
0 -rw-r--r-- 1 insider insider 0 Aug 26 08:44 1503737079

因此该文件似乎是作为用户 insider 创建的。

在我的主机上,权限如下所示:

lape@localhost ~ $ ls -las ./data
total 8
4 drwxr-xr-x 2 800 800 4096 Aug 26 09:44 .
4 drwxrwxr-x 3 lape lape 4096 Aug 26 09:43 ..
0 -rw-r--r-- 1 800 800 0 Aug 26 09:44 1503737079

这表明该文件属于 uid=800(即 insider 用户,它甚至不存在于 Docker 命名空间之外)。

我已经尝试过的事情:

  1. 我尝试将 --user 参数指定给 docker run,但它似乎只能将主机上的哪个用户映射到 uid=0 ( root) 在 docker 命名空间内,在我的例子中 insider 不是 root。所以它在这种情况下并没有真正起作用。

  2. 我从容器中实现 insider(uid=800) 的唯一方法是添加 -- userns-remap="default"dockerd 启动脚本,并添加 dockremap:200:100000 到文件 /etc/subuid/etc/subgid,如 documentation for --userns-remap 中所建议.巧合的是,这对我有用,但它不是充分的解决方案,因为:

    • 它需要重新配置 Docker 守护进程的运行方式;
    • 需要对用户 ID 进行一些运算:'200 = 1000 - 800',其中 1000 是我在主机上的用户的 UID,而 800 是 insider 用户的 UID;<
    • 如果内部用户需要比我的主机用户更高的 UID,那甚至都行不通;
    • 它只能配置用户命名空间如何在全局映射,无法为每个容器进行唯一配置;
    • 这种解决方案有点管用,但对于实际使用来说有点太丑陋了。

最佳答案

如果您只需要您的用户的读取权限,最简单的方法是使用 docker 外部的 acls 添加对 /data 中所有文件和子目录的读取权限。

添加默认 acl:setfacl -d -m u:lape:-rx/data

您还需要授予对目录本身的访问权限:setfacl -m u:lape:-rx/data

这样的解决方案有什么障碍吗?

关于linux - 在特定的用户命名空间配置中运行每个 Docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45895158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com