0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【 Node × Docker 】重いイメージの軽量化、マルチステージビルド

Posted at

プロフィール

22歳の大学生です、2025/4月から就職してエンジニアをやります

  • サッカー好き
    • 国内サッカー:柏レイソルサポーター
    • 海外サッカー:プレミア、セリエを観戦 Roma推し
  • アニメ、漫画好き
    • ジャンププラス定期購読者
    • ラノベ系のアニメ
    • 最近はガンダムにハマる
  • ラーメンは二郎系が好み

最近はNestJSで個人開発を進めています

イメージが重い

フロントがNext.js、バックがNestJSで個人開発を進めています。
データベース等は省きますが、これらのコンテナをDockerで構築しています。

※docker-compose.yml

nestjs:
  build:
    context: ./api
    dockerfile: Dockerfile
    volumes:
      - ./api/nest-api:/app
    ports:
      - '3000:3000'
    networks:
      - app-networks

nextjs:
  build:
    context: ./frontend
    dockerfile: Dockerfile
    volumes:
      - ./frontend/next-front:/app
    ports:
      - '4000:3000'
    networks:
      - app-networks

networks:
  app-networks:
    driver: bridge

※Dockerfile (next, nestどちらもほぼ同じ記述です)

FROM node:20.10.0

WORKDIR /app

COPY package*.json ./

RUN npm i -g @nestjs/cli

RUN yarn install

COPY . .

CMD ["npm", "run", "start"]

このように環境構築をしていた当時のイメージ容量は以下です。
Next.jsコンテナのイメージ:1.5GB
Nest.jsコンテナのイメージ:1.43GB

細かい数字までは覚えていませんが、ほとんどこの数字で合っているはずです。

コンテナを起動する際、止める際に少し鬱陶しく感じていたので、軽量化を試みました。

Let's 軽量化!

行ったこととしては2つです。

  1. .dockerignoreの追加
  2. マルチステージビルド

.dockerignoreでは特に大したことはしていません。
node_module等を.dockerignoreに記しただけです。

マルチステージビルドは、Dockerfileを以下のように書き換えました。

FROM node:20.10.0 as build-stage

WORKDIR /app

RUN npm i -g @nestjs/cli \
    && yarn install

COPY . .

#実行ステージ
FROM node:20.10.0

WORKDIR /app

COPY --from=build-stage /app/node_modules ./node_modules
COPY --from=build-stage package*.json ./

CMD ["npm", "run", "start:dev"]

プログラム上ではそこまで大した変化ではないと思います。

マルチステージビルドについて

冒頭のFROMがビルド用のステージです。依存関係のインストール等を行います。
その後のFROMで実行環境用のステージを開始し、すでにビルドされた依存関係等のみをコピーするため、ここでコピーする以外の不要なものはイメージに含まれない。

結果、実行環境は軽量なものとなる。

実際、イメージの容量は以下のように減った。

Next.jsコンテナのイメージ:1.5GB → 1.09GB
Nest.jsコンテナのイメージ:1.43GB → 1.09GB

Dockerへの理解度がまだまだ足らないため、まだ簡易的な記述だが、大きい規模のものになれば、さらなる効果を発揮するだろう。

終わり

Dockerエンジニアになろう

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?