Docker マルチステージビルドでNode.jsでコンパイルしたjsファイルをnginxで配信する
Docker
のマルチステージビルドという機能を使い、node
のコンテナでコンパイルしたJavascript
のファイルをnginx
のコンテナで配信する方法を紹介します。
フォルダ構成は以下のようになっています。
- web
- Dockerfile
- frontend
- src(フロントエンドのソース)
- package.json
- docker-compose.yml
docker-compose.yml
は以下のようになっています。
Dockerfile
では最終的にnginx
のコンテナを起動します。
Dockerfile
でfrontend
フォルダなどの親ディレクトリを参照する必要があるため、Docker ComposeでDockerfileをビルドする際に親ディレクトリのファイルをコピーするで紹介した方法で、context
を指定しています。
docker-compose.yml
version: '3'
services:
web:
build:
context: .
dockerfile: ./web/Dockerfile
Dockerfile
を以下のようにします。
Dockerfile
FROM node as build-stage
# frontendのソースをビルド
ADD ./frontend/package*.json ./
RUN npm install
COPY ./frontend .
RUN npm run build
FROM nginx as production-stage
RUN mkdir /var/www
RUN mkdir /var/www/front
COPY --from=build-stage /code/build /var/www/front
FROM
が2つあるのがポイントです。
最初のFROM
ではnode
のコンテナを使用して、frontend
フォルダのソースをコンパイル(トランスパイル)してJavascript
ファイルを作成します。
この工程をbuild-stage
という名前でFROM
の部分で定義しています。
次に、最終的に実行するnginx
のコンテナを使用します。
production-stage
という名前でFROM
の部分で定義しています。
14行目のコピーコマンドの、--from=build-stage
で先程のbuild-stage
のコンテナを参照できます。
build-stage
で作成したJavascript
のあるフォルダのファイルを現在(production-stage
)のコンテナにコピーします。
本番環境でもコンパイル用のコンテナ(node
)を作成して、コンパイルしたJavascript
ファイルをvolume
でnginx
コンテナと共有するような構成でしたが、マルチステージビルドを使用することにより、本番環境でコンパイル用のコンテナ(node
)を用意する必要がなくなりました。