はじめに
こんにちは,Mottyです。今回はnode.jsのDocker環境を作っていく手順を説明します。
Dockerで環境構築するためのモチベーション
Dockerではコンテナ内にNode.jsと依存ライブラリがすべて閉じ込められているので、どの環境でも一貫して動する。開発者のローカル環境に依存せず、すべての依存関係が同一バージョンで実行されるため、"It works on my machine"問題を防ぐことができる、とのこと。
構築方法
WSL上のどこかのプロジェクトのルートディレクトリに以下2つを作成
・Dockerfile
・package.json
Dockerfileの構築方法
# ベースイメージとしてNode.jsの公式イメージを使用
FROM node:16
# 作業ディレクトリを設定
WORKDIR /usr/src/app
# package.jsonをコピーして依存関係をインストール
COPY package*.json ./
RUN npm install
#コンテナを終了させないためのコマンド
CMD tail -f /dev/null
{
"name": "my-node-app",
"version": "1.0.0",
"description": "A simple Node.js app",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"author": "Your Name",
"license": "ISC",
"dependencies": {
"express": "^4.17.1"
}
}
この状態でDockerをビルドする。具体的には、以下のコマンドで↓
docker build -t my-node-app .
そのままコンテナ立ち上げ
docker run -d my-node-app
立ち上がっているコンテナのリストをみて、my-node-appがあればOK
docker ps
コンテナを終了させないための仕掛け
Dockerコンテナは通常、メインプロセスが終了するとコンテナも停止します。例えば、node app.jsなどのプロセスが終了した場合、コンテナ自体も停止します。
CMD tail -f /dev/null は、この動作を防ぐためのコマンドです。
tail コマンド は通常、ファイルの末尾を監視するために使います。-f オプションをつけると、指定したファイルに新しい行が追加されるたびに、その内容を表示し続けます。
/dev/null は、特殊なファイルで、どんなデータを書き込んでも捨てられ、空のままになります。つまり、読み出しても何も返ってきません。
tail -f /dev/null の意味は、「何もない空のファイルを永遠に監視し続ける」ということです。このプロセスは何もしないため、終了せずにずっと動作し続けます。
上記コマンドを使うと、Dockerコンテナの中で何もしないプロセスがずっと実行され続けることになり、コンテナも終了しません。つまりコンテナを終了させずに待機状態にしておき、他の操作(例えば、後からコンテナ内に入って作業をするなど)が可能になります。
検証
package.jsonがコピーされているのを確認します。
その後、app.jsを作成しpackage.jsonに定義したnpm startを走らせることでコンソールに出力結果が表示されればOKです