LoginSignup
1
1

Next.jsの本番環境をdockerで構築する方法

Last updated at Posted at 2023-09-24

経緯

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

参考資料

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1