我正在尝试在 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
我在 Mac 版 Docker 上也遇到了同样的问题,而且该设置确实存在于主机而不是容器上。主机不是 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 d 或 Ctrl-a Ctrl-d。请参阅屏幕手册#分离。
不幸的是,该设置不会保留并在重新启动后重置,因为底层文件系统是只读的。如果有人能告诉我该怎么做,我将不胜感激。
根据 Docker 维护者的此 GitHub 问题评论,访问虚拟机的推荐方法是通过特权 Docker 容器。
尝试登录虚拟机:(我建议这样做,而不是使用 TTY 上的屏幕)
$ docker run -it --privileged --pid=host justincormack/nsenter1
是否有可能从 docker 镜像构建阶段更改这些 sysctl 设置
不。映像构建的输出只是一个文件系统映像,加上一些有关默认环境变量的元数据以及在您
docker run
映像时运行的命令。它不包括正在运行的进程、sysctl 值或其他任何内容。
记住 sysctl 设置通常是全局内核级设置;由于所有 Docker 容器共享主机的内核,因此它们通常共享相同的 sysctl 值。 (由于容器通常也有独立的文件系统,因此通过 inotify 监视文件系统更改并不是一个常见的用例;如果代码或其他映像上下文发生重大更改,则更常见的是重建映像,然后删除并重新创建容器。)
docker run --sysctl
更改一组有限的值,但这些不包括 inotify 值。更改此值的唯一方法是在主机上以 root 身份在 Docker 外部运行 sysctl
。
对于 Git Hub 操作: 尝试这个解决方案
container:
image: node
options: --user root --privileged
steps:
- run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
- run: sysctl -p
- run: cat /proc/sys/fs/inotify/max_user_watches