我正在运行 Ubuntu Xenial 并从模板(也是 Xenial)设置简单的非特权用户容器。
当我连接到内部并尝试升级或安装任何“apt-get”时,它会失败并显示以下消息:
root@c1:/# apt-get update
E: setgroups 65534 failed - setgroups (22: Invalid argument)
E: setegid 65534 failed - setegid (22: Invalid argument)
Reading package lists... Done
E: setgroups 65534 failed - setgroups (22: Invalid argument)
E: setegid 65534 failed - setegid (22: Invalid argument)
E: Method gave invalid 400 URI Failure message: Failed to setgroups - setgroups (22: Invalid argument)
E: Method gave invalid 400 URI Failure message: Failed to setgroups - setgroups (22: Invalid argument)
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (112)
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (112)
那么问题是——这里发生了什么事?
答案1
默认情况下,用户“_apt”的 uid 为 65534,但 lxc(和主机)配置为仅允许用户(因此是非特权容器)拥有 10000 个子 uid 和子 gid。
一个解决方案可能是将容器内的用户“_apt”uid 设置为 10000 以下。
另一种方法是提高主机上的 subuid/subgid 限制。sudo usermod --add-subuids 260000-325536 --add-subgids 260000-325536 $USER
对拥有容器的用户使用命令,并确保 lxc 用户容器配置如下:
lxc.id_map = u 0 260000 65536
lxc.id_map = g 0 260000 65536
答案2
我在构建 docker 容器时遇到了类似的错误。原来是我忘了sudo
在 docker build 命令前写入。
答案3
lxc
就我而言,@Alwin 的解决方案无法使用,因为我正在无根运行。至于 @dilettant 解决方案,我的环境中没有,尽管如此,还是_apt
使用 替换了 的 uid sed -i 's/_apt:x:100:65534/_apt:x:100:100/g' /etc/passwd
。还遵循了 @cheshirekow 的评论,在我的例子中/proc/<pid>/setgroups
包含allow
而不是deny
。
我通过brew
使用以下替代方法安装来间接解决了该问题:
RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
ENV PATH=$MVND_HOME/home/linuxbrew/.linuxbrew/bin:$PATH