目的
laravelプロジェクトにawsのs3アダプタをインストールしようとして、dockerコンテナ内に入ってcomposer require league/flysystem-aws-s3-v3 ~1.0
を実行したら下記の通りKillされました。
root@9f833b0a116f:/var/www/html/laravel# composer require league/flysystem-aws-s3-v3 ~1.0
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Killed
コロサナイデ……
これを、ちゃんと殺されずにインストール完了させたいので色々調べました。
TL;DR
Docker for Macのメモリ割り当てをできる範囲で増やす。
解決法
調べたこと
まず、Killed
がどういう時に発動するのかを調べました。
ら、OOM Killer
と呼ばれる動作らしいです。
OOM Killer(Out of Memory Killer)は,システムが実メモリーと仮想メモリー空間(スワップ領域)を使い切り,必要なメモリー領域を新たに確保できない場合に,プロセスを強制終了させて空きメモリーを確保する,Linuxカーネルの仕組みです。OOM Killerは,空きメモリーが確保できないことによりシステム自体が停止するという最悪の事態を避けるために用意されています。
日経XTECHさんより引用
強制的にプロセスがKillされてしまうのは、システム自体が止まってしまわないようにOOM Killerさんが働いた結果らしいです。
つまり、今回の原因はメモリ不足。
Docker for macで、Preferences > Resources > Memory
を見てみると、現在は3.75GB割り当てしていることがわかりました。Swapは1GB。
合わせてMacのアクティビティモニタでdockerが使っているメモリを調べて見ると、割り当て分ほとんど使い切っていました。
実行したこと
Docker for macのPreferences > Resources > Memory
から、割り当てのメモリをできる範囲で増やしました。
mac自体は16GBなので、まぁ一回様子見て5GBまであげてみることに。
改めてcomposer require league/flysystem-aws-s3-v3 ~1.0
を実行。
root@9f833b0a116f:/var/www/html/laravel# composer require league/flysystem-aws-s3-v3
Using version ^1.0 for league/flysystem-aws-s3-v3
~略~
Package manifest generated successfully.
38 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
無事入りました。
思ったこと
今回は5GBで足りたけど、例えばいくつかの案件を掛け持ちしていて、常にいくつもDockerコンテナを立ち上げる……という状態だとメモリ割り当て→食いきるのいたちごっこになるのでは?と思いました。
開発時からコンテナはrestart: always
で設定しがちだけど、長く使わないものはちゃんと落としておく、などの対策もした合わせてした方が良いのかもしれないですね。