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