docker上のPHP5.3-FPMへ環境変数を引き継げるようにする
PHP5.3のFPMでは、clear_envという環境変数をPHP側に来る前にクリアする設定をオフ(no) にすることができないため、通常はそのまま環境変数をphp側に引き継ぐことができません。 そのため、dockerの起動時にDBの接続先が設定された環境変数をPHP側に渡して設定するといったことができないのですが、以下の対応で、環境変数の引き継ぎができたので記録として残しておきます。
なぜ、環境変数を引き継げないのか
冒頭にも書きましたが、PHP5.3では、clear_envをオフ(no)にする設定がないため、FPM ワーカープロセスに到達する前に、環境変数がクリアされてしまうためです。
clear_env
とは、
https://php.net/manual/ja/install.fpm.configuration.php
FPM ワーカー内の環境をクリアする。 任意の環境変数が FPM ワーカープロセスに到達してしまうことを防ぐために、 ワーカー内の環境をいったんクリアしてから、このプールの設定で指定された環境変数を追加します。 PHP 5.4.27、PHP 5.5.11、PHP 5.6.0 以降で利用可能です。 デフォルト値: Yes
環境設定を行うためには、php-fpmのプール設定ファイルに以下のような記述が必要となります。
env[HOGE] = hoge
対応
docker 起動時にプール設定ファイルに環境変数を書き出すようにします。
サンプル
- Dockerfile
FROM centos:6 RUN yum -y update RUN yum -y install php \ php-fpm \ && rm -rf /var/cache/yum \ && yum clean all COPY ./www.conf /etc/php-fpm.d/www.conf COPY ./docker-entrypoint.sh /usr/local/bin/ RUN chmod u+x /usr/local/bin/docker-entrypoint.sh CMD ["docker-entrypoint.sh"]
- docker-entrypoint.sh
#!/bin/bash mkdir -p /usr/local/etc/conf.d/ env | sed "s/\(.*\)=\(.*\)/env[\1]='\2'/" > /usr/local/php-fpm-env.conf # 環境設定の書き出し exec php-fpm
- /etc/php-fpm.d/www.conf
[www] listen = 9000 user = apache group = apache pm = ondemand pm.max_children = 10 include=/usr/local/php-fpm-env.conf # プール設定の読み込み
起動時に環境変数をプール設定ファイルに書き出すため、コンテナ内で環境変数を変えても反映されないので注意
こちらにサンプルコードとして公開しています。 https://github.com/takapi86/docker-php53-fpm
参考
https://github.com/docker-library/php/issues/74#issuecomment-78980679