簡體   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