在執行 ubuntu:xenial(macOS 主機)的 Docker 容器中為 memlock 設置 ulimit 時出現“不允許操作”錯誤
我在像這樣啟動的容器中設置“memlock”系統限制時遇到問題:
docker run -it ubuntu:xenial
簡而言之,這是我嘗試過的:
在 bash 終端會話 1 中:
docker run -it ubuntu:xenial
設置
/etc/security/limits.conf
為包括這些行 `* hard memlock unlimited
- soft memlock unlimited`
在文件的末尾。
然後,從主機 ‘bash in’ 上的另一個 bash 終端到同一個容器並嘗試執行以下操作:
root@6ae391cfb6de:/# ulimit -l unlimited
我收到此錯誤:
bash: ulimit: max locked memory: cannot modify limit: Operation not permitted
重現細節
我在 MacOS Sierra 10.12.6 / Docker 版本 18.03.1-ce 上執行,建構 9ee9f40
外殼 #1
macOS>
ulimit -l # output of this command is 'unlimited' which shows host ulimits are not the issue
輸出為:無限制macOS>
docker run -it ubuntu:xenial
下面的命令在 bash shell #1 中從 Mac 上的上述命令啟動的 xenial-docker-instance 中執行
cd # to home directory grep limit .bashrc # check it any session limits are defined at shell startup -- nothing found cat >> /etc/security/limits.conf <<EOF * hard memlock unlimited * soft memlock unlimited EOF
Mac 上的 Shell #2
containerId=`docker ps | grep ubuntu | sed -e's/ .*//'` # assumes you only have one docker instance of ubuntu running docker exec -t -i $containerId bash # 'bash in' to ubuntu running container launched in shell #2 ulimit -l # output is 82000 ... huh? # # try setting ulimit -l unlimited # # Nope.. i get this error: # bash: ulimit: max locked memory: cannot modify limit: Operation not permitted
結束:重現細節
非常感謝任何提示或指導。
我的朋友 Chris Cellucci 給了我答案:使用 –privileged 執行
我將在今天或明天更詳細地對此進行擴展。
給 docker 提供這種能力是不好的。
在 Linux 上,我的猜測是它是能力
CAP_IPC_LOCK
。為什麼需要鎖定,這通常不是一個好主意,或者需要。它不會阻止休眠交換。
我在這裡檢查了https://docs.docker.com/docker-for-mac/docker-toolbox/#the-docker-toolbox-environment mac 上的 docker 有兩個版本。兩者都在虛擬機中的 linux 實例上的容器中執行。因此,功能將是相關的:您必須添加適當的功能。見http://man7.org/linux/man-pages/man7/capabilities.7.html