[英]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.