概要
- Dockerコンテナで起動しているphpmyadminにSQLのZIPファイルをインポートしたら、以下のエラーが出てきました。
アップロードしようとしたファイルが大きすぎるようです。この制限に関する対策については ドキュメント をご覧ください。
- このエラーは、アップロードしようとしたファイルが許容されたサイズを超えていることを意味しています。
- 本記事では、このエラーの原因と解決方法を記載します。
環境
- Docker
- Client: Docker Engine - Community: 20.10.23
- Server: Docker Desktop 4.13.1 (90346): 20.10.20
- docker compose: 3.3
- python:3.6
- phpmyadmin: 5.2.0
- (phpmyadmin)PHP: PHP 8.0.19 (cli)
- (phpmyadmin)MySQL Community Server (GPL): 5.7.30
- (phpmyadmin)Apache/2.4.53 (Debian)
原因の追求
- phpmyadminはデフォルトでは
2,048K
がMAXになっています。今回アップロードしたファイルは5.9MB
あったので、確かにオーバーしています。ということでググってみると、php.ini
ファイルを編集してあげれば良いという記事が多かったので実際やって見ました。 - phpmyadminのdockerコンテナに入って、以下コマンドで読み込んでいる
php.ini
を見てみます。すると以下のように設定されていました。あれ、(none)
になってる!?
$ php --ini
Configuration File (php.ini) Path: /usr/local/etc/php
Loaded Configuration File: (none)
Scan for additional .ini files in: /usr/local/etc/php/conf.d
Additional .ini files parsed: /usr/local/etc/php/conf.d/000-xxx.ini,
/usr/local/etc/php/conf.d/docker-php-ext-bz2.ini,
/usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
/usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini,
/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini,
/usr/local/etc/php/conf.d/docker-php-ext-zip.ini,
/usr/local/etc/php/conf.d/opcache-recommended.ini,
/usr/local/etc/php/conf.d/phpmyadmin-misc.ini,
/usr/local/etc/php/conf.d/session-strict.ini
- ということで、
php.ini
を/usr/local/etc/php
に新規作成し、以下の項目を変えて見ました。
upload_max_filesize = 200M
post_max_size = 200M
- これで再起動!してみるものの、phpmyadminでの表示は
2,048K
が最大サイズのまま変わりません。 - nginxを使っているので、ウェブサーバーを再起動してみましたが、変わらず。
- うーん、なんでだろう。ということで、違う方法はないか調べて見たところ、ありました。
解決方法
- 以下の記事に、
docker-compose.yml
を直接編集してあげる方法もあると記載あり。 - この通りに、以下のように追記しました。
environment:
PMA_HOST: "mysql"
PMA_PORT: 3306
UPLOAD_LIMIT: 300M
- これで再起動すると、、、phpmyadminの「アップロードファイル」の表示が変わりました!
- 念の為、なんで
php.ini
編集しても治らなかったのかなと思い、phpmyadmin-misc.ini
を見てみる。 - 以下のように
docker-compose.yml
ファイルで設定した環境変数はここで指定されています。
allow_url_fopen=Off
max_execution_time=${MAX_EXECUTION_TIME}
max_input_vars=10000
memory_limit=${MEMORY_LIMIT}
post_max_size=${UPLOAD_LIMIT}
upload_max_filesize=${UPLOAD_LIMIT}
- もしかして、
phpmyadmin-misc.ini
がphp.ini
より優先されているのでは?と思います。 - 一般的には、
php.ini
ファイルで明示的に設定された値がphpmyadmin-misc.ini
よりも優先されるらしいですが、Dockerコンテナ内でPHPが実行されるときは、環境変数でオーバーライドされた場合が優先されるのかもしれません。上記の参考記事で挙げたstackflowでも同じようなコメントがあるので、その可能性が高いような。確実な情報をお持ちの方がいたらぜひ教えてください。おそらく以下の要素によってphp.ini
ファイルとphpmyadmin-misc.ini
どちらが優先されるか異なると思われます。- Docker、docker-composeのバージョン
- PHP、phpMyAdminのバージョン
- OS
- ちなみに、直接
docker-compose.yml
に書き込まなくとも、任意に設定した別ファイルをローカルに作成してマウントする、という方法もあります。
phpmyadmin:
volumes:
- ./phpmyadmin-misc.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini
- ということで、
php.ini
を編集しても変わらなかった、という方は、docker-compose.yml
から試して見てください。