LoginSignup
6
9

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-05

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();
6
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9