コンテナでカーネルパラメータの設定が必要な時に
sysctl
で調整したいけど、
bash: sysctl: command not found
となって使えないので困った時の対処方法です。
そもそもは、mac+Rancher Desktop+Laravel+viteでの開発環境下で
#npm bun dev
のホットリロードで開発をしたかったのですが、
その際に以下のエラーが発生しました。
Error: ENOSPC: System limit for number of file watchers reached, watch '/var/www/vendor/ramsey/collection/src/Exception/CollectionMismatchException.php'
監視するファイルが多すぎですよとエラーが出ていました。
Linuxではinotifyという仕組みを使ってファイル監視を行っているという記事もあり、その記事を参考に
cat /proc/sys/fs/inotify/max_user_watches
で上限数の確認をすると、「30460」となっていました。
開発している環境下のファイル数を
#find . -type f | wc -l
で調べると、「39924」で、上限以上になっています。
ここの上限を上げたい!ということで、記事を参考にコンテナ内で
#sysctl fs.inotify.max_user_watches=524288
とコマンドを入力しても上述したようにnot foundとなってしまいます。
Docker Composeでカーネルパラメータを設定する方法も見つけたので、
docker-compose.ymlに以下のような記述をしてみました。
sysctls: fs.inotify.max_user_watches:524288
コンテナを起動しようとすると、そんなパラメータがないよとエラーになり・・
Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: sysctl "fs.inotify.max_user_watches" is not in a separate kernel namespace: unknown
そこで、Rancher Desktopでカーネルパラメータを設定(上書き)する方法を見つけたので、試してみました。
(1)/Users/{user}/Library/Application\ Support/rancher-desktop/lima/_config
配下にoverride.yamlを作成
(2)override.yamlに以下を記述
provision: - mode: system script: | #!/bin/sh sudo sysctl fs.inotify.max_user_watches=524288
(3)Rancher Desktopを再起動
(4)コンテナを再ビルド
起動後に
cat /proc/sys/fs/inotify/max_user_watches
で確認すると、「524288」となり、変更出来ていました!
#npm bun dev
で動かしてもエラーが出なくなり、
無事ホットリロード化の環境が構築出来ました。
尚、コンテナ環境でLaravel+viteでホットリロードで開発するには、
コンテナ環境の5173ポートを開けておく必要があります。
docker-compose.yml
ports: - "80:80" - "5173:5173"
さらに、vite.config.js
に以下の追記がないとホットリロードがうまく動きませんでした。
server: { watch: { usePolling: true }