phanコンテナイメージを作った

DockerPHP

きっかけ

[https://packagist.org/packages/phan/phan]

[https://twitter.com/tadsan/status/1200485101542367233:embed]

  • @tadsanさんがphan/phanのイメージを作っていた
  • 初めイメージに詰める方式で作っていて、途中でbind-mount方式に切り替えていた
  • ので、勝手にイメージに詰める方式を引き継いだ

作ったイメージ

Dockerfile

FROM php:7.3-cli-alpine AS work

# ----------------------------------------
# install composer
# ----------------------------------------
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /.composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# ----------------------------------------
# install build-dependencies
# ----------------------------------------
RUN apk add --update-cache --no-cache --virtual=.build-dependencies ${PHPIZE_DEPS}

# ----------------------------------------
# install php extensions
# ----------------------------------------
RUN pecl install ast

# ----------------------------------------
# install phan
# ----------------------------------------
RUN composer global require phan/phan


# ----------------------------------------
# artifact
# ----------------------------------------
FROM php:7.3-cli-alpine

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /.composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY --from=work /.composer/vendor /.composer/vendor
COPY --from=work /usr/local/lib/php/extensions /usr/local/lib/php/extensions
RUN docker-php-ext-enable ast

WORKDIR /app


ENTRYPOINT ["/.composer/vendor/phan/phan/phan"]
  • ビルドしたイメージは89MBくらい
  • php:7.3-cli-alpineが76MBくらいなので、+13MBくらい

学び

  • マルチステージビルド

    • composerはCOPY --from=composer:<tag> /usr/bin/composer /usr/bin/composerで入れるのがコンテナ時代らしくて良い気がする
    • PHP拡張が必要な場合のマルチステージビルド

      • /usr/local/lib/php/extensionsを丸っとコピーすればいいみたい
  • いつも雰囲気で書いていた部分の理解

    • pecl installdocker-php-ext-enable
  • ビルド依存のインストール

    • ${PHPIZE_DEPS}を使えば自前でいっぱい書かなくて済む
    • インストールしたバッチに名前をつけておいて、あとでまとめて掃除できる

      • 今回はマルチステージビルドなので掃除してないけど