【ElasticSearch】vm.max_map_countを自動設定する in Docker Desktop WSL2

Docker Desktop を WSL2ベースエンジンに変更したところ、ElasticSearchで久しぶりに以下のエラーに遭遇

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

以下、試してみた対処法の備忘録です。

目次

成功

手動設定

とりあえず、まずは手動対応。

docker-desktopに入って(wsl -d docker-desktop)、以下のコマンドで対応

sysctl -w vm.max_map_count=262144

Result

設定成功。

ElasticSearch起動成功。

ただし、毎回、Docker Desktop起動後に対応が必要

.wslconfigを利用

以下のコメントを参照。

Hi, we finnaly found the trick via the .wslconfig file :
https://stackoverflow.com/questions/69214301/using-docker-desktop-for-windows-how-can-sysctl-parameters-be-configured-to-per/69294687#69294687

以下、リンク先の解説に従って、.wslconfigを追加し、以下の内容を追加

[wsl2]
kernelCommandLine = "sysctl.vm.max_map_count=262144"

.wslconfigの場所は、%userprofile%。基本、C:\Users\<username>でいいと思います。

設定後、Docker Desktopを終了して、wsl --shutdownしたあと、再起動。

Result

設定成功。

ElasticSearch起動成功。

今のところ、問題なく動作しています。

※ 今後、動作に問題があった場合は追記予定です。

補足

先述の手順で、Docker Desktopの終了のみで、wsl --shutdownをしないとvm.max_map_countの設定が適用されていませんでした。

他のディストリビューションが起動したままだったので、一つでも残ってると適用されないのかもしれません。

リンク先だと、Docker Desktopの終了については触れられていませんが、アプリだけ起動したままの状態が不安だったので、念のためwsl --shutdownの前に終了しています。

参考ページ

その他、試してみた事

不安定

crontabを利用

crontabを使用した、対処法。

まずは、念のため、docker-desktopをバックアップします。

Docker Desktopを停止して、以下を実行

wsl --export docker-desktop "[path-to-backup]/[backup-file-name].tar"

バックアップ後、以下を実行

# docker-desktop内に入る
wsl -d docker-desktop

# 実行ファイルの作成
mkdir -p /my/scripts
echo "sysctl -w vm.max_map_count=262144" > /my/scripts/at_reboot.sh
chmod +x /my/scripts/at_reboot.sh

# crontabのバックアップ
crontab -l > crontab.backup

crontab -eでcrontabの編集。以下を追記

@reboot /my/scripts/at_reboot.sh

Docker Desktopを再起動。

以下のコマンドで、設定の確認。

wsl -d docker-desktop
sysctl -a | grep vm.max_map_count

vm.max_map_count = 262144の表示があれば成功です。

必要に合わせてバックアップ。Docker Desktopを停止して以下を実行。

wsl --export docker-desktop "[path-to-backup]/[backup-file-name].tar"
Result

設定不安定。

ElasticSearch起動不安定。

たまに、vm.max_map_count = 262144の設定がされていなくて、動かない。

参考リンク

システム起動時に1度だけ実行されるCronを設定する

不可?

「/etc/sysctl.d/*」または「/etc/sysctl.conf」を利用

以下を参考に/etc/sysctl.d/99-my-custom.conf/etc/sysctl.d/00-alpine.conf/etc/sysctl.confvm.max_map_count = 262144を追記。

Result

設定不安定。

ElasticSearch起動不安定。

1回か2回ほど、たまたま動作した事がありましたが、手順ミスの可能性もありそうなので、見出しでは[不可?]としています。

wsl.confを利用

.wslconfigについて調べていて、以下の記事でwsl.confでディストリビューションごとの設定が行えるということが紹介されていました。

[boot]設定でできそうかなと思い、試してみました。

以下のコマンドでwsl.confを開きます。

wsl -d docker-desktop
vi /etc/wsl.conf

以下の内容を追記

[boot]
command="sysctl -w vm.max_map_count=262144"

再起動して、設定確認。

Result

設定不可。

ElasticSearch起動不可。

できそうかなと思ったんですが、うまく行きませんでした。

補足

docker-desktop内のファイルの編集について

編集前に、wsl --exportでバックアップを取っておいた方がいいと思います。

また、本記事ではdocker-desktop内でファイルの編集をしていますが、ファイルエクスプローラのアドレスバーに\\wsl$を入力すると、Windows上でdocker-desktopのファイルを開くことができるので、それでもいいかもしれません。

動作は未確認ですが、Windowsで編集した内容はdocker-desktop内でも変更が確認できました。

まとめ

今のところ、.wslconfigを利用した方法が問題なく動いているので、.wslconfigの利用が無難化と思います。

※ 問題が出た場合は、追記予定です。

wsl.confでdocker-desktopだけに変更が適用できればと思ったのですが、残念ながらうまく行きませんでした。

これ以上は、ドツボ感があるので、一旦休止。

他にいい方法あるよ!といった場合は、コメントなどから教えてもらえると助かります。