経緯
Next.jsで作成した、アプリケーションの本番環境をdockerで構築しようとしたときに、詰まって試行錯誤した結果、npmがうまく実行できたので備忘録として記します。
dockerfile
dockerfile
# syntax=docker/dockerfile:1
ARG NODE_VERSION=18.16.0
################################################################################
# 全てのステージのベースイメージとしてnodeイメージを使用する。
FROM node:${NODE_VERSION}-alpine as base
# すべてのビルドステージの作業ディレクトリを設定。
WORKDIR /usr/src/app
################################################################################
# 本番環境の依存関係をインストールするステージを作成する。
FROM base as deps
# Dockerのキャッシュ機能を最大限に活用するため、依存関係を別のステップでダウンロードする。
# /root/.yarn へのキャッシュマウントを利用して、後続のビルドのスピードアップを図る。
# package.jsonとyarn.lockのバインドマウントを利用して、これらをこのレイヤにコピーする必要がないようにする。
RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=package-lock.json,target=package-lock.json \
--mount=type=cache,target=/root/.npm \
npm ci --production
################################################################################
# アプリケーションをビルドするためのステージを作成する。
FROM deps as build
# ソースファイルの残りをイメージにコピー。
COPY . .
# ビルドスクリプトを実行。
RUN npm run build
################################################################################
# 最小限のランタイム依存関係でアプリケーションを実行する新しいステージを作成する。
# 必要なファイルはビルドステージからコピーされる。
FROM base as final
# 既定で本番のnode環境を使用する。
ENV NODE_ENV production
# ルート以外のユーザーとしてアプリケーションを実行する。
USER node
# パッケージマネージャのコマンドが使用できるようにpackage.jsonをコピー。
COPY package.json .
# depsステージからの本番依存関係と、buildステージからビルドされたアプリケーションをイメージにコピーする。
COPY --from=deps /usr/src/app/node_modules ./node_modules
COPY --from=build /usr/src/app/.next ./.next
#imagesもコピー
COPY ./public ./public
# アプリケーションを実行。
CMD npm start
docker-compose.yml
docker-compose.yml
version: '3'
services:
next-app:
container_name: next-app
image: next-app
build:
context: .
dockerfile: dockerfile
args:
ENV_VARIABLE: ${ENV_VARIABLE}
NEXT_PUBLIC_ENV_VARIABLE: ${NEXT_PUBLIC_ENV_VARIABLE}
restart: always
ports:
- 6000:6000
コンテナの起動
docker-compose build
docker-compose up -d
参考資料