Docker 必须设置 nproc 限制,看起来太高了,容器无法 运行

Docker nproc limit has to be set, seemingly, too high in order for a container to run

我正在尝试调试不属于我的图像的奇怪行为 - GitHub repo with the image

运行

docker run -it --ulimit nproc=100 --ulimit nofile=90:100 --network none --tmpfs /tmp:rw,noexec,nosuid,size=65536k --tmpfs /home/glot:rw,exec,nosuid,size=131072k --user=glot --read-only glot/python:latest /bin/bash

结果 exec /bin/bash: resource temporarily unavailable

但是,如果我们将 nproc 提高到 10000,它就会突然开始工作(对我来说,即使提高到 1000 也会导致同样的错误)。

此图像没有 ps,但从我在 proc 文件夹中看到的,进程不会超过 2 个。

我对 Linux 和容器限制没有经验,因此欢迎任何见解和评论。

P.S。 一些背景知识:此图像用作执行短暂代码片段的沙箱,nproc 限制缓解了分叉轰炸问题。

来自 https://docs.docker.com/engine/reference/commandline/run/

For nproc usage Be careful setting nproc with the ulimit flag as nproc is designed by Linux to set the maximum number of processes available to a user, not to a container. For example, start four containers with daemon user:

docker 运行 -d -u daemon --ulimit nproc=3 busybox top docker 运行 -d -u daemon --ulimit nproc=3 busybox top docker 运行 -d -u daemon --ulimit nproc=3 busybox top docker 运行 -d -u daemon --ulimit nproc=3 busybox top 第 4 个容器失败并报告“[8] 系统错误:资源暂时不可用”错误。这失败了,因为调用者设置 nproc=3 导致前三个容器用完了为守护进程用户设置的三个进程配额。

正如@Philippe 的评论所说 - 每个用户读取 ulimit 指标 system-wide。

问题是为图像创建的用户与主机上的主用户共享相同的 UID,尽管用户名不同。当在容器中对 nproc 实施限制时,将考虑此 UID 的进程总数(包括来自本地主机用户的所有进程)。由于这是 运行 在具有许多 运行 进程的桌面环境中,因此它打破了进程数量的 100 个硬限制(甚至 1000 个)也就不足为奇了。

注意 ulimit 和 UID,它们不是按容器封装的,而是在整个系统范围内共享的。在容器内实施 ulimits 时,在容器和主机之间具有不同用户名但相同 UID 的用户被视为同一用户。