きっかけ
[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
を丸っとコピーすればいいみたい
- composerは
-
いつも雰囲気で書いていた部分の理解
pecl install
やdocker-php-ext-enable
-
ビルド依存のインストール
${PHPIZE_DEPS}
を使えば自前でいっぱい書かなくて済む-
インストールしたバッチに名前をつけておいて、あとでまとめて掃除できる
- 今回はマルチステージビルドなので掃除してないけど