今回やること
- npm install で追加する依存パッケージを、 Docker ビルド時のキャッシュにする
- npm run production で生成したファイルをコンテナに含める。
ポイント
PHP での依存パッケージは、 Docker コンテナ実行時にも必要なため、含める必要がありました。
しかし、 JavaScript 関連の依存パッケージは、 コンテナ実行時はコンパイルして生成したファイルのみが必要 で、依存パッケージ自体はコンテナに含める必要はないため、除外します。
コード
- マルチステージビルドを用いる。 Node.js イメージをビルドのために使用する。
- ビルドの前に依存パッケージをビルド用コンテナに追加する。そのために必要なファイルは、 package.json と package-lock.json の 2 つ。
- ビルドに必要なファイルを用意するが、どれが必要でどれが対象かを精査しメンテナンスするのが非常に手間なので、プロジェクト全体のファイルを対象とする。
- ビルドして生成したファイルのみを実行するコンテナへコピーする。コピーしたのは、
app/public/css/
,app/public/js/
,app/public/mix-manifest.json
の 3 つ。app/public/mix-manifest.json
は不要な気もするのだが、よくわからないのでコピー対象に含めた。
$ git diff Dockerfile
diff --git a/Dockerfile b/Dockerfile
index b14b03a..085b1a2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,6 +6,13 @@ RUN composer dump-autoload \
&& composer run-script post-root-package-install \
&& composer run-script post-create-project-cmd
+FROM node:12 AS build_npm
+WORKDIR /app
+COPY ./package.json ./package-lock.json ./
+RUN npm install
+COPY . .
+RUN npm run production
+
FROM php:7.3-apache
ARG TZ=Asia/Tokyo
@@ -33,3 +40,6 @@ RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf
COPY --from=build --chown=www-data:www-data ./app/ .
RUN touch ./database/database.sqlite
+COPY --from=build_npm --chown=www-data:www-data ./app/public/css ./public/css
+COPY --from=build_npm --chown=www-data:www-data ./app/public/js ./public/js
+COPY --from=build_npm --chown=www-data:www-data ./app/public/mix-manifest.json ./public/mix-manifest.json
おわりに
コード全体です。
以上です。