Windowsでdockerの再インストールや環境構成の変化によって、dockerコマンド実行時にエラーが表示される場合の対応方法です。 docker-machineの構成が存在しない docker関…
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
“`
コメントを書く