我正在运行 MacOS Sonoma,并全新安装了 Podman v5.2.0。
当我在 Debian 上部署一个标准 NodeJS pod 并将 NodeJS 应用程序部署到该 pod 时,我的问题就开始了。 Pod 标签是:
node:20-bookworm-slim
在此 Pod 中,我的 NodeJS 应用程序会监视文件系统更改并自动重新加载
npm run build:css -- --watch
但是,我的应用程序无法启动,因为我用完了文件观察程序。我收到错误了
Error: ENOSPC: System limit for number of file watchers reached
我尝试了所有增加 fs.inotify.max_user_watches 的标准方法,例如
echo 'fs.inotify.max_user_watches=524288' | tee -a /etc/sysctl.conf && sysctl -p
导致错误
sysctl: permission denied on key "fs.inotify.max_user_watches"
我还尝试直接使用
编辑值echo 524288 | dd of=/proc/sys/fs/inotify/max_user_watches
但这会导致错误
dd: failed to open '/proc/sys/fs/inotify/max_user_watches': Read-only file system
无论我如何尝试,都不可能从 Pod 内部更改这些 inotify 值。
在了解到 Docker 和 Podman 从主机继承大部分 sysctl 值后,我尝试使用以下命令手动设置本地 MacOS maxfiles 值:
sudo sysctl -w kern.maxfiles=524288
但是,当我重新启动 Debian pod 并检查它的限制时:
cat /proc/sys/fs/inotify/max_user_watches
结果是
8192
因此,在我的 Mac 上更改此值对 Pod 中的值没有任何影响。
Podman v5.2.0 不启动使用 MacOS 作为主机的 pod。相反,Podman 使用自己的虚拟机(称为 Podman 默认机)启动新的 pod。新 Pod 继承的值不是来自您的系统,而是来自该虚拟机。
为了编辑此值,您需要通过 SSH 连接到 Podman 默认计算机。默认情况下它是锁定的,因此您需要在以下位置启用对该计算机的访问:
Settings > Preferences > Extension: Podman > Remote
您要确保“加载远程系统连接 (ssh)”已启用。
然后,从您的终端使用
访问 Podman 默认机器podman machine ssh
这应该会将您作为 root 加载到默认的 CentOS 容器中。从那里,你可以简单地运行
echo 'fs.inotify.max_user_watches=524288' | tee -a /etc/sysctl.conf && sysctl -p
永久更新 max_user_watches 参数。然后,启动的任何新 Pod 都会继承此参数。
注意:这应该适用于您需要在 pod 上执行的任何 sysctl 工作。您无法从 pod 中编辑其中许多值,因此您需要在 Podman 默认计算机中编辑它们并在启动时继承它们。