Server

[docker-compose] 「docker-compose.override」でdockerの構成を上書きする

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でやっている場合は、このあたりを使用して切り替えを円滑に行っていきましょう