docker-compose PHP xdebugを開発・本番環境でインストール有無を分けるyaml定義

docker-compose PHP xdebugを開発・本番環境でインストール有無を分けるyaml定義

PHPの開発において、デバッグのためにxdebugをインストールしたいと思うことがあります。
加えて、docker環境で開発するためのxdebugインストール設定をdocker-compose・dockerfileに含めたいと思います。

しかし、開発環境ではxdebugはインストールしたいけれど、本番環境ではインストールしたくないケースも考えられます。
その場合のdocker-compose, dokerfileを一つで管理する方法を紹介します。

よくある問題例

調べると一番に見つかるのは、docker定義ファイルを環境ごとに用意し、コンテナ起動コマンド時に読み込むファイルを指定する方法です。

  • docker-compose.yml.develop
  • docker-compose.yml.staging
  • docker-compose.yml.production
  • Dockerfile.develop
  • Dockerfile.staging
  • Dockerfile.production

ですが、これは差異のある箇所以外のdevelop, staging, productionで一致していて欲しい定義がずれる危険があります。

そうなってくるとdockerを使うメリットも薄れてしまいます。

.envファイルを用意する

docker-compose.ymlを配置するアプリケーションルート等に.envという名前の環境設定ファイルを作成します。
docker-composeでは、こちらに定義された値を変数として参照することが出来ます。

開発環境ではtrueをセットし、本番環境ではfalseにして運用するイメージです。

# xdebug
WORKSPACE_INSTALL_XDEBUG=false

docker-compose.yml

webのコンテナをビルドする場合の引数(args)として、.envで定義した値を受け渡します。

web:
  build:
    args:
    - INSTALL_XDEBUG=${WORKSPACE_INSTALL_XDEBUG}

Dockerfile

webコンテナを定義するDockerfileにxdebugをインストールする命令を記載します。
その際には、xdebugをインストールするかどうかのbool値を見て処理を分岐します。

ARG変数として、args引数で受け渡されなかった場合のデフォルト値にfalseをセットしておきます。
xdebug.iniに直接設定値を書き込む例のため、複雑な設定が必要な場合などは予め用意したxdebug.iniファイルをコピーするなど、変更してください。

# xdebug
ARG INSTALL_XDEBUG=false

RUN if [ ${INSTALL_XDEBUG} = true ]; then \
    pecl install xdebug \
    && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.remote_autostart=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.remote_host=host.docker.internal" >> /usr/local/etc/php/conf.d/xdebug.ini \
;fi

“`

プログラミングカテゴリの最新記事