繁体   English   中英

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

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

我正在尝试调试我不拥有的图像的奇怪行为 - GitHub 图像回购

跑步

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 和容器限制没有经验,因此欢迎任何见解和评论。

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

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

对于 nproc 的使用 请小心使用 ulimit 标志设置 nproc,因为 nproc 是由 Linux 设计的,用于设置用户可用的最大进程数,而不是容器。 例如,以 daemon 用户启动四个容器:

docker run -d -u daemon --ulimit nproc=3 busybox top docker run -d -u daemon --ulimit nproc=3 busybox top docker run -d -u daemon --ulimit nproc=3 busybox top docker run -d - u daemon --ulimit nproc=3 busybox top 第4个容器失败,报“[8] System error: resource temporary unavailable”错误。 这失败了,因为调用者设置 nproc=3 导致前三个容器用完了为守护进程用户设置的三个进程配额。

正如@Philippe 的评论所说 - ulimit 指标在系统范围内按用户读取。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM