#状況
AWSのEC2インスタンスにLaradockを使ってLaravelのローカル開発環境を作成していた。
Laradockの環境構築が終わりdocker-compose up -d nginx mysql
でコンテナを起動。"laradock_workspace_1"にdocker-compose exec workspace bash
で接続しLaravelを生成しようとしたところ以下のエラーが発生。
EC2のインスタンスタイプは"t2.micro"(RAM1GB)、AMIはAmazon Linux 2。
$ root@4e964ed4f2ce: composer create-project --prefer-dist laravel/laravel ./
Installing laravel/laravel (v7.0.0)
- Installing laravel/laravel (v7.0.0): Downloading (100%)
proc_open(): fork failed - Cannot allocate memory
The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems)
Unzip with unzip command failed, falling back to ZipArchive class
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details
PHP Warning: proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952
Warning: proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952
[ErrorException]
proc_open(): fork failed - Cannot allocate memory
create-project [-s|--stability STABILITY] [--prefer-source] [--prefer-dist] [--repository REPOSITORY] [--repository-url REPOSITORY-URL] [--dev] [--no-dev] [--no-custom-installers] [--no-scripts] [--no-progress] [--no-secure-http] [--keep-vcs] [--remove-vcs] [--no-install] [--ignore-platform-reqs] [--] [<package>] [<directory>] [<version>]
以前にも見たことがあったのでスワップファイルを作成しようとしたが上手くいかなかった。
起動しているコンテナはこんな感じです。
[ec2-user@ip-172-31-47-6 laradock]$ sudo docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1 dockerd-entrypoint.sh Up 2375/tcp, 2376/tcp
laradock_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
laradock_nginx_1 /bin/bash /opt/startup.sh Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:81->81/tcp
laradock_php-fpm_1 docker-php-entrypoint php-fpm Up 9000/tcp
laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp, 0.0.0.0:8001->8000/tcp,
0.0.0.0:8080->8080/tcp
#試してみたこと
普通にスワップファイルを作成してみる。
メモリ使用状況(MB表示)
スワップ領域は現在割り当てられていない。
$ root@4e964ed4f2ce:/var/www# free -m
total used free shared buff/cache available
Mem: 983 566 217 3 200 232
Swap: 0 0 0
スワップ領域用のファイルを作成
$ root@4e964ed4f2ce:/var/www# /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 14.8802 s, 72.2 MB/s
作成したswap.1というファイルをスワップ領域に設定
$ root@4e964ed4f2ce:/var/www# /sbin/mkswap /var/swap.1
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=450a4e24-3455-4466-a6e0-5daf190cdad3
スワップ領域を有効化
root@4e964ed4f2ce:/var/www# /sbin/swapon /var/swap.1
swapon: /var/swap.1: insecure permissions 0644, 0600 suggested.
swapon: /var/swap.1: swapon failed: Operation not permitted
するとswapon failed: Operation not permitted
というエラーが出てスワップ領域の有効化に失敗する。
権限の問題なのでsudoをつけて試すが結果は変わらず。
dockerに載っているOSの権限設定をいじると解決するようですがあまり理解していないところをいじりたくない、、、
#解決策
そもそものスワッピングの原因は物理メモリが不足していること。
スワップファイルを作成して仮想メモリ追加でどうにかするのではなくてEC2のスケールアップで対応しました。
インスタンスタイプ: t2.micro -> t2.small
1時間当たりの料金も1円程度しか変わらないので問題ないかと思います。
※リージョンはap-northeast-1a(東京)
インスタンスタイプ | RAM(GB) | オンラインLinux料金 |
---|---|---|
t2.micro | 1 | 0.0116 USD 1 時間あたり |
t2.small | 2 | 0.023 USD 1 時間あたり |
#参考にさせて頂いたページ
Laravel で Cannot allocate memory がでたときの対策
DockerのOperation not permittedというエラーに対応する