PHP
xdebug
Docker
PHP5.6
alpine

Alpine Linux + PHP5.6 の Docker コンテナで、xdebug や ssh2 モジュールをマルチステージビルドする

PHP5.6 + Apache mod_php のコンテナを、Ubuntuベースから → Alpine Linux ベースに変更した。

Alpine Linux の apk パッケージリポジトリでは、PHP5.6用の xdebug や SSH2 モジュールは無いため、PECL からソースコードを持ってきて Docker コンテナ内でビルドする必要がある。

1つの Alpine の Docker コンテナで、ビルド環境を整えて xdebug や SSH2 をインストールすると 240MB ぐらいのイメージサイズになるが、ビルド環境構築済みの Docker コンテナで必要なものだけビルドし、ビルド済みオブジェクトファイルだけを新しい Alpine ベースのイメージにコピーする方法 (マルチステージビルド) だと、Docker イメージのサイズを 50MB ぐらいに抑えられる。

ちなみに、これを書いた時点の Alpine の最終バージョンは 3.9 だが、PHP5.6系のリポジトリが充実しているのは 3.7 なので、3.7 をベースとした。


Dockerfile

# BUILDER ( xdebug, ssh2 をビルドするため)

# php5.6 が使えるのは3.7まで
FROM alpine:3.7 as builder

MAINTAINER ytyng

# pecl コマンドは pear をインストールすると使える
RUN apk --no-cache add \
gcc\
libc-dev\
autoconf\
make\
libssh2-dev\
php5\
php5-cli\
php5-pear\
php5-openssl\
php5-dev

# そのままだと php コマンドがないため pecl できない。
RUN ln -s /usr/bin/php5 /usr/bin/php

RUN pecl channel-update pecl.php.net

# pecl でビルド
RUN pecl install xdebug-2.5.5
RUN pecl install ssh2-0.13

# 実運用コンテナ
FROM alpine:3.7

RUN apk --no-cache add \
php5\
apache2\
php5-apache2\
php5-mysql\
php5-imap\
php5-zlib\
php5-pdo_mysql\
php5-iconv\
php5-mcrypt\
php5-exif\
php5-gd\
php5-xml\
php5-cli\
php5-pear\
php5-pdo\
php5-curl\
php5-openssl

RUN mkdir /run/apache2
RUN rm /etc/apache2/conf.d/userdir.conf /etc/apache2/conf.d/info.conf

COPY --from=builder /usr/lib/php5/modules/xdebug.so /usr/lib/php5/modules/
COPY --from=builder /usr/lib/php5/modules/ssh2.so /usr/lib/php5/modules/
RUN echo "zend_extension=/usr/lib/php5/modules/xdebug.so" > /etc/php5/conf.d/xdebug.ini
RUN echo "extension=ssh2.so" > /etc/php5/conf.d/ssh2.ini

COPY site.conf /etc/apache2/conf.d/site.conf

COPY php-extends.ini /etc/php5/conf.d/php-extends.ini

EXPOSE 80 443

CMD ["httpd", "-D", "FOREGROUND"]


phpinfo() を見てみると

phpinfo__.png

phpinfo__.png

別コンテナでビルドしたモジュールが読み込めている。

参考までに、他のファイル


docker-compose.yaml

version: '2'

services:
php56-alpine:
build: .
image: php56-alpine:0.1
container_name: php56-alpine
privileged: true
ports:
- 80:80
- 443:443
volumes:
- ./src:/var/src


php-extends.ini

[date]

date.timezone = "Asia/Tokyo"

[xdebug]
xdebug.remote_enable=1
xdebug.remote_host=10.200.10.1
xdebug.remote_port=9001
xdebug.remote_autostart=0
xdebug.force_display_errors=1
xdebug.force_error_reporting=1
xdebug.idekey="PHPSTORM"

# リモートデバッグ用
# sudo ifconfig lo0 alias 10.200.10.1/24 しておく



site.conf

DocumentRoot "/var/src/htdocs"

<Directory "/var/src/htdocs">
AllowOverride All
Require all granted
</Directory>


src/htdocs/index.php

<?php

phpinfo();