LXC 非特权容器:apt-get 无法下载其中的任何内容

LXC 非特权容器:apt-get 无法下载其中的任何内容

我正在运行 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

相关内容