Nest.jsで運用環境用のDockerfileを作成する

Nestjsのプロダクション環境
◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

ども!今回はNest.jsをDockerで運用環境の作り方について執筆しました。単一コンテナとしてNest.jsをデプロイするための運用環境を作成しました。開発環境と運用環境が揃えることが開発環境作成のスタートラインになるかと思います。開発環境用ビルドと運用環境ビルドで分けて開発!

はじめも

ども!少しだけCI地獄から抜け出すことができている龍ちゃんです。ブログをつらつらと書いていたら、呼び出されて仕事が追加されました。何事も続けてみるものだなって感じです。昨日なんて弊社で開発しているOSSのロゴ作成してました。もう本格的に何屋かわからなくなってましたね。

それでは本題のほうに移っていきましょう。

前回は、Nest.jsの開発環境を作成しました(Nest.js『だけ』をdevcontainerで構築する:ゼロから始める環境構築)。開発はこのままでもできるのですが、いざ何かしらにデプロイするとなった際に開発環境のままでは、できないので「運用環境用ビルド」を作成していきたいと思います。

今回の記事でわかることは以下になります。

Nest.jsを単一コンテナでデプロイする際の運用環境の作り方

それでは、始めましょう。

Nest.jsの運用環境を作成する

ディレクトリ構成を以下に書いておきます。

.
├── Dockerfile
├── Dockerfile.prod               # 運用環境用Dockerfile
├── docker-compose.yml            
├── docker-compose.prod.yml       # 運用環境用dokcer-compose
└── backend/                      # Nest.jsのプロジェクト

今回作成するファイルとしては、以下の2つになります。

  • Dockerfile.prod
  • docker-compose.prod.yml

基本的な部分としては、開発環境時に作成したファイルと構成が似ています。見比べながら進めてもらえると理解が深まるかと思います。単一コンテナとしてデプロイする場合は、Dockerfileのみで大丈夫なのですが、ローカルで確認する際にはdocker-composeを使用して、ポートやマウントの設定をした方が楽なので2つファイルを作成しています。

Dockerfile.prod

ここでは、運用環境用のDockerfileについて説明をしていきます。基本的な構造としては、前回の開発環境と似ています。

ARG NODE_VER
FROM node:20.10.0

RUN npm update -g npm
RUN npm i -g @nestjs/cli

USER node
WORKDIR /home/node/app

COPY --chown=node:node backend .

RUN npm install --production

RUN npm run build

EXPOSE 3000

ENTRYPOINT ["node", "dist/main.js"]

やっていることはとても単純です。

  • npmのアップグレード
  • nest CLIのインストール
  • ソースコードをWORKDIRのルートにコピー
  • 依存パッケージのインストール(npm install —production)
  • ビルド(npm run build)

起動コマンドとしては、ビルドで作成されたファイルを直接指定して起動しています。Nest.jsの標準搭載のnest startもあるかと思いますが、こちらはコマンドを叩いたタイミングでビルドがされるのでタイミングが使いづらいこともあって事前にビルドする形をとっています。

docker-compose.prod.yml

ここでは、起動を容易にするために作成するdocker-composeについて説明します。基本的な構造としては、前回の開発環境とそっくりです。

version: "3.7"
services:
  nest:
    build:
      context: .
      dockerfile: Dockerfile.prod
    tty: true
    volumes:
      - ./backend:/home/node/app
      - node_modules:/home/node/app/node_modules
      - dist:/home/node/app/dist
    ports:
      - "3000:3000"

volumes:
  node_modules:
  dist:

追加のマウントとして、Volumesにビルド時に生成されるdistを指定しています。

起動確認

ここまでファイルを作成したら起動確認を行いましょう。以下のコマンドを打ちこんでください。

docker compose -f docker-compose.prod.yml build --no-cache

docker compose -f docker-compose.yml up -d

その後、特に変更を加えてなければhttp://localhost:3000にアクセスできれば成功です。運用環境のビルドなので実行が確認することができたら、イメージとボリュームを削除しておきましょう。

docker compose -f docker-compose.prod.yml down -v --rmi all

これで、ボリュームとイメージを削除して停止させることができます。

おわりも

ども~今回ので開発環境と運用環境の作成が完了しました。あとは、GitHub Actionsでデプロイがすることができれば完璧です。次回の記事予定は、Web Apps for Containerにデプロイになります。普段はフロントエンドの開発ばかりをしているので、バックエンドの知見はたまりにくい傾向です。ここ最近は、CI/CDの流れからバックエンドの勉強も少し捗っているので、どちらの記事も「ええ塩梅」で上げていこうと思います。

ではまた!

Twitterのほうもよろしくお願いします。

アバター画像
About 龍:Ryu 107 Articles
2022年入社で主にフロントエンドの業務でTailwindと遊ぶ日々。お酒とうまいご飯が好きで、運動がちょっと嫌いなエンジニアです。しゃべれるエンジニアを目指しておしゃべりとブログ執筆に注力中(業務もね)//
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる