Docker の php:7-alpine イメージで Composer と Xdebug を使えるようにする

経緯

slimphp/Slim-Skeleton を利用したいと考えました。

手元の端末で開発しようとしたところ、 XAMPP に Xdebug を入れ忘れていたことに気付きました。しかも、 XAMPP の PHP のバージョンで Xdebug のインストールが止まってしまいました。

そこで、スケルトンプロジェクトに付随している Docker Compose での開発を試みましたが、この Docker Compose 内で pull してくるイメージは Composer も Xdebug もないので入れることにしました。

コード

ディレクトリ構造

root/
    ├ _docker/                               // Dockerに関する設定置き場
    │    ├ dockerfiles/
    │    │    ├ settings/
    │    │    │    └ php.ini                 // PHPの設定 (Xdebug 有効化)
    │    │    │
    │    │    └ Dockerfile
    │    │
    │    ├ mysql/                            // MariaDB 用ディレクトリ
    │    │    └ .gitkeep
    │    │
    │    └ phpmyadmin/
    │         ├ conf/
    │         │    └ phpmyadmin-misc.ini     // phpMyAdmin の設定 (メモリ上限など)
    │         │
    │         └ sessions/
    │              └ .gitkeep
    │
    └ docker-compose.yml

Docker に関する部分のみ列挙。

docker-compose.yml

version: '3.7'

volumes:
    logs:
        driver: local

services:
    slim:
        build:
            context: ./_docker/dockerfiles/
            dockerfile: Dockerfile
        working_dir: /var/www
        command: php -S 0.0.0.0:8080 -t public
        environment:
            docker: "true"
        ports:
            - 8080:8080
        volumes:
            - .:/var/www
            - ./logs:/var/www/logs
    db:
        image: mariadb
        restart: always
        ports:
            - 3306:3306
        volumes:
            - ./_docker/mysql/mysql:/var/lib/mysql
            - ./_docker/mysql/initdb.d:/docker-entrypoint-initdb.d
        environment:
            - MYSQL_ROOT_PASSWORD=pwd
            - MYSQL_DATABASE=test
            - MYSQL_USER=user
            - MYSQL_PASSWORD=pwd
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        volumes:
            - ./_docker/phpmyadmin/sessions:/sessions
            - ./_docker/phpmyadmin/conf/phpmyadmin-misc.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=db
            - PMA_USER=user
            - PMA_PASSWORD=pwd
        ports:
            - 8081:80

変更点は以下。

  • PHP 用環境: Dockerfile を使ったイメージにカスタマイズ
  • DB: MariaDB のイメージをそのまま利用
    • environment のパラメータはそのまま使用。アプリケーションや phpMyAdmin 側と動機は取れていないですがひとまずはこれで……
  • phpMyAdmin: これも phpMyAdmin 公式イメージを流用

_docker/dockerfiles/Dockerfile

FROM php:7-alpine
RUN apk --update add curl
RUN set -ex \
  && apk --no-cache add \
  autoconf build-base
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
RUN docker-php-ext-install pdo_mysql
COPY settings/php.ini /usr/local/etc/php/conf.d
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer

php:7-alpine をベースに Xdebug と Composer を追加。

_docker/dockerfiles/settings/php.ini

xdebug.mode=coverage

Xdebug でカバレッジを有効化するための設定を追加するため。なお、 DockerfileCOPY する際のホストマシンでのパスは Dockerfile の存在するディレクトリから下でないと参照できない という地味な制約があるので dockerfiles ディレクトリをわざわざ掘りました。

_docker/phpmyadmin/conf/phpmyadmin-misc.ini

allow_url_fopen = Off
max_execution_time = 600
memory_limit = 64M
post_max_size = 64M
upload_max_filesize = 64M

メモリ上限等のカスタマイズ。


これで今回はカバレッジ出力まで動作することを確認しました。

参考

Xdebug

Warning: XDEBUG_MODE=coverage or xdebug.mode=coverage has to be set

が出たので step3 について実施。

なお、今回のケースでは

extension=xdebug.so

は不要だった。

Dockerfile

ほぼこれでOK.

こちらも参照。 php -vwith Xdebug と付いていればOK。

Dockerfile の COPY

Mariadb

could not find driver

普通に考えたら確かにドライバがないので追加して解決。

シェル

bash ではなく ash 。 bin/ash 指定。

sr -c

最終的には使わずに済みましたが念のためメモ。

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。