この記事では、docker imageのビルド中にWSL2がメモリを食いすぎて落ちるので、WSL2を起動させる前に.wslconfigで使用できるメモリを制限しようという内容です。

 

docker-compose buildでdockerのimageをビルドできない

 

普段は開発に使っている環境はwindows10 proなのでHyper-vでDocker Desktopを動かしています。ramも16Gあるので特段pcのスペック不足で困ったことはありませんでした。

ただ、いつもと違う環境でdockerを動かすということがあって、そこでちょっとつまずきました。

windows10のhome(ramは8g)なので、とりあえず、巷です進められているとおりWSL2上でDocker Desktopを動かして、

で、いつも通り`docker-compose build`でイメージをビルドしたわけなんですが、イメージのダウンロード中に必ずWSL2が落ちる。

 

wsl2が落ちるときの対処法は?

 

エラーメッセージはこんな感じ

Step 1/8 : FROM pytorch/pytorch
 ---> b423j43234432
Traceback (most recent call last):
  File "compose\cli\main.py", line 67, in main
  File "compose\cli\main.py", line 126, in perform_command
  File "compose\cli\main.py", line 302, in build
  File "compose\project.py", line 468, in build
  File "compose\project.py", line 450, in build_service
  File "compose\service.py", line 1147, in build
compose.service.BuildError: (<Service: ... >, {' ... ': ' ... '})

During handling of the above exception, another exception occurred:

いろいろ出ていますが、このメッセージはDocker Desktopが起動できていないときに出るやつです。

ちなみに、vmmenというプロセスが大量にメモリを食っているみたい・・・。

 

vmmenがメモリを大量に占有

 

調べていみるとvmmenというプロセスがメモリを占有してて、これのせいでフリーズしたりクラッシュしてしまうという現象に悩まされている人は他にもいるみたいです。

ずっと監視していたら、3.5Gくらい使ってました。全体で8GBしかないのに一つのプロセスがそんなに使ったら落ちるに決まってますよね。

 

 

解決方法:.wslconfigを書いてWSL2が使えるメモリを2GBに制限

 

次の方法を試したところ解決しました。

windowsのユーザーフォルダ(C:\Users\<ユーザー名>)でwslの設定ファイル.wslconfigを作ります(もともとある方はどっちを使います)。

.wslconfigに

[wsl2]
memory=2GB
swap=5GB
swapFile=C:\\<適当にどこか指定>

と書きます。

その後WSL2を再起動させればいいのですが、pc事体を再起動させてもいいと思います。

memoryはWSL2が単体で使っていいramの容量。swapはssdもしくはhddでデータを退避させていい容量です。

memoryはHyper-v版のvmのデフォルトの容量が2GBで、これまで別に2GBで困ったことがないので2GBに設定しました。

Dockerで動かすものによりますけど、自分が動かそうとしているものはもっとメモリを制限してもよかったかもしれません。実際この後同じ構成で1Gに制限しましたが問題なく動きました。

swapは退避領域のことですが、PCのストレージの空き容量に困ってないのなら余裕を持って設定していいと思います(どこかのブログでmemoryの2倍を指定しておけばいいって書いてあるのを見ました)。

↑全部適当なので、ちゃんとした値を使いたい人は調整してください。

要は、ホストのwindowsがクラッシュするほどDockerを動かすために使っているWSL2がメモリを食うのを防げばいいだけです(WSL側で何とかしてほしい感はある)。

 

結論、WSL2は便利

 

この後もWSL2でDockerを動かしていますが、快適に使えています。

WSL2の仕組みをいまいち理解していないので微妙ですが、LinuxのVMを0から立ち上げているわけではないので、WSL2を利用している方が軽いのではないでしょうか・・・。

ハイパーバイザーが使えないwindows pro以外のPCはバーチャルボックスでVMを立ち上げる必要がありますが、それよりは軽い気がしてます。

 

 

それでは。