docker - 如何使用用户命名空间在 Docker 容器中切换用户
问题描述
我正在运行 dockerd 19.03.1,构建 74b1e89,并在专用 ID 范围上启用了用户命名空间
cat > /etc/sub{uid,gid}
dockeruser:120000:10000
我需要将容器从 root 切换到专用用户,我将其创建为
ARG USERID=26551
ENV runUID=${USERID}
ARG GROUPID=26551
ENV runGID=${GROUPID}
ARG USERNAME='testuser'
ENV runUSER=${USERNAME}
ARG groupNAME='testgroup'
ENV runGROUP=${groupNAME}
RUN groupadd -g ${runGID} ${runGROUP} && useradd -u ${runUID} -g ${runGID} -r ${runUSER}
但是,我无法在容器上下文中切换到用户。su以及gosu的替换失败类似于
[root@1d5594cd99a0 /]# su - testuser ls
su: cannot set groups: Invalid argument
根据有关用户命名空间映射的文档,这可能是一个警告,并且会影响所有依赖setuid或/和su检查实际二进制所有者的二进制文件。
是否可以在容器上下文中的另一个用户下的 Docker 容器中运行命令/二进制文件,并为 dockerd 启用用户命名空间?
解决方案
回答我的问题
我没有为用户命名空间定义足够的 subuids/subgids。
前
/etc/subuid
/etc/subgid
dockeruser:120000:10000
我在 UID=26551 的容器中创建了一个用户 - 其中 26551 不在 [120000,120000+10000] 范围内,因此切换到该用户失败。
使固定
将 subuid 和 subgid 范围扩展到 [200000,200000+100000] 并实际包括 UID
/etc/subuid
/etc/subgid
dockeruser:200000:100000
推荐阅读
- reactjs - 如何使用 React Native 在 Android 上添加 Maven 构建依赖项?
- ag-grid - 拖动到另一个网格时如何复制一行?
- java - Java 8 中的 PriorityBlockingDeque?
- javascript - 如何在多行中显示嵌套标签?
- reactjs - react-native-flatlist-slider 中的 scrollToIndex 超出范围
- css - Github markdown equations 改变 textcolor
- c++ - Stringizing operator # 不能处理一个双引号的情况
- javascript - 从子域设置 cookie
- python - 为什么 Jupyter 笔记本在浏览器中打开但不起作用?
- python - 将数据框与 Pandas 合并