Dot-Net

更改 Docker 容器中的 inotify.max_user_instances 限制

  • February 8, 2022

我正在嘗試在 Dockerfile 級別更改 docker env 的 inotify.max_user_instances 設置。我正在嘗試這樣做,因為我收到此錯誤:

應用程序啟動異常:System.IO.IOException:已達到配置的 inotify 實例數量的使用者限制 (128)。

我已經使用:

.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: false);

我也嘗試使用自定義“WebHost.CreateDefaultBuilder(args)”,因為有人指出它使用 reloadOnChange: true 和同一個文件。

也嘗試在 dockerfile 中執行:

RUN sysctl -w fs.inotify.max_user_watches=1048576
RUN echo fs.inotify.max_user_watches=1048576 | tee -a /etc/sysctl.conf && sysctl -p

但有人指出,不可能脫離這種情況。

是否有可能從 docker 映像建構/部署階段更改這些 sysctl 設置?我有點迷失了。

如果有幫助,應用程序正在使用 .net core 2.2

是否有可能從 docker image build 階段更改這些 sysctl 設置

不,鏡像建構的輸出只是一個文件系統鏡像,加上一些關於預設環境變數的元數據和docker run在鏡像時執行的命令。它不包括正在執行的程序、sysctl 值或其他任何內容。

請記住,sysctl 設置通常是全域核心級設置;由於所有 Docker 容器共享主機的核心,它們通常共享相同的 sysctl 值。(由於容器通常也具有隔離的文件系統,因此通過 inotify 監視文件系統更改並不是一個真正常見的案例;如果程式碼或其他映像上下文發生重大變化,重建映像然後刪除並重新創建容器。)

您可以通過一組有限的值進行更改,docker run --sysctl但這些值不包括 inotify 值。更改此值的唯一方法是sysctl在 Docker 外部的主機上以 root 身份執行。

我在 Docker for Mac 上遇到了同樣的問題,實際上該設置存在於主機而不是容器上。主機不是 Mac OS,而是在後台執行的 Linux VM。要更改那裡的設置,您需要從終端訪問它:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

如果你得到一個空白螢幕Enter,你應該得到一個$docker-desktop提示。通過鍵入以下命令應用您的設置:

sysctl -w fs.inotify.max_user_watches=1048576

退出螢幕Ctrl-a dCtrl-a Ctrl-d。請參閱螢幕手冊# Detach

不幸的是,由於底層文件系統是只讀的,因此該設置不會保留並在重新啟動後重置。如果有人能告訴我該怎麼做,我將不勝感激。

2021 年更新(見本期

根據Docker 維護人員的此 GitHub 問題評論,訪問 VM 的推薦方法是通過特權 docker 容器。

嘗試登錄虛擬機:(我建議這樣做而不是在 TTY 上使用螢幕)

$ docker run -it --privileged --pid=host justincormack/nsenter1

引用自:https://stackoverflow.com/questions/57220658