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() を見てみると

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

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

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();