ども!今回はNest.jsをDockerで運用環境の作り方について執筆しました。単一コンテナとしてNest.jsをデプロイするための運用環境を作成しました。開発環境と運用環境が揃えることが開発環境作成のスタートラインになるかと思います。開発環境用ビルドと運用環境ビルドで分けて開発!
はじめも
ども!少しだけCI地獄から抜け出すことができている龍ちゃんです。ブログをつらつらと書いていたら、呼び出されて仕事が追加されました。何事も続けてみるものだなって感じです。昨日なんて弊社で開発しているOSSのロゴ作成してました。もう本格的に何屋かわからなくなってましたね。
それでは本題のほうに移っていきましょう。
前回は、Nest.jsの開発環境を作成しました(Nest.js『だけ』をdevcontainerで構築する:ゼロから始める環境構築)。開発はこのままでもできるのですが、いざ何かしらにデプロイするとなった際に開発環境のままでは、できないので「運用環境用ビルド」を作成していきたいと思います。
今回の記事でわかることは以下になります。
それでは、始めましょう。
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のほうもよろしくお願いします。