dockerで開発する際に、ローカルの開発環境ではxdebugを有効しにしたいが、本番ではxdebugをインストールしないようにしたいなどの状況が発生すると思います。
そこで今回は前回の記事で作成した「nginx」と「php-fpm」のコンテナを使い、環境ごとにdockerの設定を用意する方法を紹介します。
「docker-compose」には、差分の設定として「docker-compose.override.yml」を使うことで環境ごとに設定を分ける事ができます。
0. 環境
- macOS Mac Sonoma 14.6.1
- Docker 27.2.0
- Docker Compose v2.29.2-desktop.2
1. ディレクトリ構成
ディレクトは以前と、だいたい同じ感じですが、「docker-compose.override.yml」が追加されます。
また同時に環境ごとに設定ファイルを用意しておきます。
/
├── .docker/
│ ├── nginx/
│ │ ├── conf.d/ # サーバ名とルートディレクトリを設定
│ │ │ └── example.com.conf
│ │ ├── Dockerfile
│ │ └── nginx.conf
│ ├── php/
│ │ ├── conf.d/ # サーバ名とルートディレクトリを設定
│ │ │ └── example.com.conf
│ │ ├── Dockerfile
│ │ └── php.ini
│ │ └── docker-php-ext-xdebug.ini
└── docker-compose.yml
└── docker-compose.override.yml # 環境ごとに差分の設定を記述する
└── docker-compose.override.yml.develop # 開発環境の設定
└── docker-compose.override.yml.production # 本番環境の設定
上記の「docker-compose.override.yml」は「.gitignore」に追加しておきGit管理はしないようにします。
使用する場合は「docker-compose.override.yml.develop」や「docker-compose.override.yml.production」を作成しておき、こちらをコピーして使うようにします。
これにより環境ごとに設定を分けることができます。
2. docker-compose.yml の修正
前回から「docker-compose.yml」のファイルの中で環境依存する箇所を消して最低限の設定を記述します。
services:
# PHP Service
app:
build:
context: .
dockerfile: ./.docker/php/Dockerfile
volumes:
- ./src/:/app
- ./.docker/logs/php:/var/log/php
# Nginx Service
web:
build:
context: .
dockerfile: ./.docker/nginx/Dockerfile
depends_on:
- app
volumes:
- ./src/:/app
- ./.docker/logs/nginx:/var/log/nginx
前回存在していた「xdebug」の設定ファイルやポートは環境によって異なるため削除しております。
3. docker-compose.override.yml の作成
環境ごとに設定を分けるために「docker-compose.override.yml」を作成します。
services:
# PHP Service
app:
# xdebugをインストールしたい場合の変数を渡す
build:
args:
BUILD_ENV: debug
# xdebugをインストールしたい場合のDockerfileを指定
volumes:
- ./.docker/php/docker-php-ext-xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
- ./.docker/php/php.dev.ini:/usr/local/etc/php/conf.d/php.dev.ini
# Nginx Service
web:
ports:
- "9083:80"
上記の例では「app」サービスに「xdebug」をインストールするための設定を追加しています。
また「web」サービスには「9083」ポートを開放しています。
上記は開発環境で使用するため「docker-compose.override.yml.develop」として保存しておきます。
また上記から本番に必要な設定があれば追加しておき「docker-compose.override.yml.production」として保存しておきます。
こちらはパスワードやトークン等の記述がない限りはGitで管理しておきましょう
4. php側の Dockerfile の修正
先ほどの「docker-compose.override.yml」に「args」がありますが、これは「Dockerfile」に変数の値を渡すためのものです。
ここの値をもとに「Dockerfile」内で「debug」の文字列が設定されていた場合に「xdebug」をインストールするようにします。
FROM php:8.3-fpm
ENV TZ Asia/Tokyo
ARG BUILD_ENV=prod
RUN set -eux && \
apt-get update -qq && \
apt-get upgrade -qq && \
apt-get install -y git unzip libzip-dev libicu-dev libonig-dev >/dev/null && \
docker-php-ext-install intl pdo_mysql mbstring zip bcmath opcache >/dev/null && \
if [ "${BUILD_ENV}" = "debug" ] ; then pecl install xdebug > /dev/null ; fi && \
apt-get clean && \
:
COPY ./.docker/php/php.ini /usr/local/etc/php/php.ini
COPY --from=composer:2.4.3 /usr/bin/composer /usr/bin/composer
WORKDIR /app
上記の「Dockerfile」では「BUILD_ENV」の値が「debug」の場合に「xdebug」をインストールするようにしています。
「docker-compose.override.yml」で「BUILD_ENV」の値を変更することで「xdebug」をインストールするかどうかを切り替えることができます。
これで開発環境では「xdebug」をインストールし、本番環境ではインストールしないように設定ができました。
5. dockerイメージのビルド
最後にdockerイメージをビルドしなおして設定を反映させます。
docker-compose build -no-cache
コンテナの起動
docker-compose up -d
以上で環境ごとにdockerの設定を用意する方法を紹介しました。
デプロイをCI/CDでやっている場合は、このあたりを使用して切り替えを円滑に行っていきましょう