DockerをつかったNodeJS開発・実行環境
NodeJSの開発をしているとき、実行環境を個別に作って残しておきたかったり、Nodeバージョンをコロコロ変えたかったりしたいので、Dockerコンテナを使ってNodeJSの開発・実行環境を作れるようにしました。
実行のたびにクリーンなコンテナを立てて、実行終わったらコンテナごと消すやり方もありますが、今回はコンテナ立てたまま動かすやり方です。
使い方としては、
- 開発始める前にコンテナ立てる
- 開発中はコンテナ立てっぱなしで、execすることでNodeJSを実行する
- コードの編集はホスト側(Windows/MacOS)でやる
- コンテナ作り直したかったら
docker-compose down
で落として、docker-compose up
する
という形を想定しています。
Docker Composeでコンテナ立てて動かす
軽量なAlpine上でNodeJSのv16系を動かしたイメージにします。
以下のdocker-compose.ymlを作成。
version: '3'
services:
app:
image: node:16-alpine
container_name: node-container
tty: true
volumes:
- ./src:/src
working_dir: "/src"
これをプロジェクトのルートフォルダにおいて、./src/以下にソースコードやpackage.jsonを置くようにします。
コンテナをたてて実行するときは、以下コマンド。
これで、コンテナが立ちっぱなしになります。
docker-compose up -d
必要なライブラリをインストール(npm install)する
上のdocker-compose.ymlで、 app:
というかたちで、名前がappのサービスを作ったので、そのサービスを指定することで、コマンドを実行できます。
npm install
をしたいので、docker-compose exec
を使い、
docker-compose exec app npm install
で、さっき立てたコンテナ上でnpm installすることができます。
execで立ってるコンテナ上でプログラムを実行
npm install
と同じく、docker-compose exec
を利用します。
docker-compose exec app node main.js
もしくは、package.jsonをしっかり書いているようであれば、
docker-compose exec app npm start
で、プログラムを実行できます。
コード書いて開発していく
docker-compose.ymlのvolumesの欄で、./srcディレクトリをコンテナ内にマウントしてあるので、ホスト側(Windows/MacOS側)で編集した内容が、常にコンテナ内にも反映されるようになっています。
なので、Windows/MacOS上で./src/main.jsなどのソースコードをもりもり編集し、 docker-compose exec app npm start
することで、もりもり開発していけます。
コンテナ立てなおす
試行錯誤するうちにコンテナの環境が汚れてくることもあるので、その時はコンテナ立てなおします。
それも簡単で、docker-compose.ymlがあるディレクトリで、
docker-compose down
docker-compose up -d
を実行すると、今まで使ってたコンテナを捨てて、新しいコンテナを立てなおすことができます。
備考 都度都度コンテナを立てて実行する
NodeJSのpackage.jsonをこんな感じにします。。
ポイントはscript.clean-startのところ。
node_modulesディレクトリを消して、モジュールインストールして、Nodeを実行する流れです。
{
"scripts": {
"start": "node ./main.js",
"clean-start": "rm -r ./node_modules && npm install && npm start"
},
"dependencies": {
}
}
これで、以下のコマンドたたくと、コンテナ立てて、上記の処理を行い、終わったらコンテナを都度都度消してくれます。
docker-compose run --rm app npm run-script clean-start
参考にしたリンク
https://qiita.com/nikadon/items/995c5705ff1171f7484d
https://docs.docker.jp/compose/compose-file.html