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 的用户被视为同一用户。
我正在尝试调试不属于我的图像的奇怪行为 - 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 的用户被视为同一用户。