Docker + php 利用できるメモリの上限値を変更する方法

1つの処理でメモリの利用料がデフォルト設定で制限されている最大値を超えると
Allowed memory size of 268435456 bytes exhausted (tried to allocate 4096 bytes)
こんなエラーが出てしまう。

メモリに余裕があるなら、php.inimemory_limitを書き換えてリビルドすればいい。

php.iniの保存場所を特定

Dockerfileを見てみよう。

自分の場合は下記のパスだった。

infra/php/Dockerfile


FROM php:8.0-fpm-buster
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

ENV COMPOSER_ALLOW_SUPERUSER=1 \
    COMPOSER_HOME=/composer

COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer

RUN apt-get update && \
    apt-get -y install git unzip libzip-dev libicu-dev libonig-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \
    apt-get clean && \
    apt-get install nkf && \
    rm -rf /var/lib/apt/lists/* && \
    docker-php-ext-configure gd --with-freetype --with-jpeg && \
    docker-php-ext-install -j$(nproc) gd && \
    docker-php-ext-install intl pdo_mysql zip bcmath

COPY ./php.ini /usr/local/etc/php/php.ini

WORKDIR /work

したから2行目に

COPY ./php.ini /usr/local/etc/php/php.ini

とあることから相対パスで./php.ini

つまり、本例の環境だとinfra/php/php.iniにあることがわかった。

php.iniの編集

zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64000M
post_max_size = 128000M
memory_limit = 1024M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /dev/stderr
default_charset = UTF-8

[Date]
date.timezone = Asia/Tokyo

[mysqlnd]
mysqlnd.collect_memory_statistics = on

[Assertion]
zend.assertions = 1

[mbstring]
mbstring.language = Japanese

7行目をmemory_limit = 1024M
にした。

元々は256Mになっていたが、これで1発の処理で最大1GBぐらいメモリが使えるようになる。

もちろんたくさんの人がこの処理を同時に走らせると、一時的にサービスが止まる可能性はある。

今回自分の環境は、数人で使う簡素な社内システムだったので上記のように変更。

Dockerリビルド

  1. php.ini ファイルの memory_limit の値が正しく 1024M に設定されていることを再確認します。
  2. docker-compose down コマンドを使って、すべてのコンテナを停止し、ネットワークやボリュームを削除します。
  3. docker-compose build --no-cache app コマンドを実行して、キャッシュを無視して app サービスのイメージを再構築します。※コンテナ名appの部分は自分の環境に合わせてくれ。
  4. docker-compose up -d コマンドを使って、コンテナを再起動します。
  5. 再度 docker-compose exec app php -r "echo ini_get('memory_limit');" を実行し、memory_limit の値が更新されていることを確認します。

「5」のコマンドはコンテナの外で叩いてね。

1024M%

と返ってくれば成功。

コンテナ中で直接echo ini_get('memory_limit');を叩いても何も表示されなかった。

無制限に質問可能なプログラミングスクール!

万が一転職できない場合は、転職保障全額返金できるコースもあり!!

無制限のメンター質問対応

 

DMMウェブキャンプでプログラミングを学習しませんか?

独学より成長スピードをブーストさせましょう!

 

まずは無料相談から!

おすすめの記事