Dockerでfrourioを動かそうとしたら「System limit for number of file watchers reached」エラーの解決法について


こんにちは。
frourioいいぞ〜と聞いていたので今回の3連休で触ってみようと思ったら、環境構築時点でDocker周りのエラーに苦戦したので解決した方法を備忘録として残してみました。

環境

  • MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) / Intel Chip
  • Docker version 20.10.12, build e91ed57
  • Docker Compose version v2.2.3
  • Rancher Desktop Version: 1.1.1
  • Container image node:16.13.2
  • frourio 0.27.1

実際に起きたエラー

Docker環境を立ち上げてからyarn runを実行した歳に発生したエラーです。エラーの内容は一部省略しています。

Error: ENOSPC: System limit for number of file watchers reached

調べてみるとNode.js系ではよく見かけるエラーのようですね。
具体的には、Linuxでファイル監視を行う処理がシステムで設定されている監視対象ファイルの上限数に到達すると出力されるようです。

原因

Linuxではinotifyという仕組みを使ってファイル監視を行っているようで、システムのデフォルトで監視対象の上限数が8192に設定されています。今回はそれを超えるファイル数が監視対象になったことが原因のようです。

実際に確認する場合は、次のコマンドを実行すると確認できます。

$ cat /proc/sys/fs/inotify/max_user_watches
8192

解決策(?)

やることは単純で次のコマンドを実行して増やしてあげればよさそうです。
ただ次のようなエラーが表示されて変更できませんでした。

$ sudo sysctl fs.inotify.max_user_watches=24288
sysctl: setting key "fs.inotify.max_user_watches": Read-only file system

問題

もう少し色々と調べてみるとコンテナ側では読み取り専用になっており変更できないようです。
具体的に検証して確かめていないですが、基本的にはホスト側の設定を引き継いでいるという記事を見かけたりしたのですが
ホスト側とコンテナ側でOSが一致しない場合はどこの値を参照しているのかそのあたりの仕組みがよく分かりませんでした。
もしかするとホストOSの値を継承せずに初期値が設定されいそうな気もします。

解決策

色々とやり方を調べている中でRancher Desktopの場合は設定をオーバーライドしてくれる仕組みがあるようなので
今回はその仕組みを使って値を変更してみようと思います。
ホスト側の端末でoverride.yamlに記述することで変更ができるようです。

~/Library/Application Support/rancher-desktop/lima/_config/override.yaml
provision:
- mode: system
  script: |
    #!/bin/sh
    sudo sysctl fs.inotify.max_user_watches=24288

念の為再起動して、もう1度コンテナ内で次のコマンドを実行してみると無事に値が変わりました。

$ cat /proc/sys/fs/inotify/max_user_watches
24288

今回初めてDockerまわりの設定をいじる機会だったのですが、もう少しこのあたりの仕組みも理解していきたいですね。
無事にfrourioも動いたのでようやく触って遊べそうです。