プロフィール
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つです。
- .dockerignoreの追加
- マルチステージビルド
.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エンジニアになろう