バッチサーバー用のNode.js + yarn環境をDockerで構築する
DockerでNode.jsを使う環境というと、ネット上ではExpressを使うまでの記事が多いのですが、最近個人的にバッチ処理をNode.jsで書いていることもあって、サーバーじゃなくてバッチ処理をするためのNode.jsコンテナを立ち上げます。
公開日:2019年7月8日
Dockerfile
一つのアプリじゃなくて、汎用的に使えるように、出来るだけプレーンにしてあります。
yarnが使いたいので、公式のコンテナイメージにyarnを追加しているのと、公式のNode.jsコンテナはそのままNode.jsシェルに入ってしまうので、一旦bashに入るようにしています。これは、後々docker execでプログラムファイルを実行するためです。
Dockerfile
FROM node:12.6-alpine
WORKDIR /app
RUN apk update && \
apk add git && \
apk add --no-cache curl && \
curl -o- -L https://yarnpkg.com/install.sh | sh
ENV PATH $HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH
CMD ["sh"]
Node.js + yarnのDockerイメージのDockerfile
イメージをビルド
保存したらビルドします。
sudo docekr build -t node-yarn .
タグ名は任意です。ここでは「node-yarn」というイメージタグをつけました。
コンテナ作成
続いてコンテナを作成します。
通常の「node ….」というコマンドで使えるようにしたいので、永続化させます。また、プログラムディレクトリも読み込ませておきます。
sudo docker run --name node-batch -v /path/to/dir:/app -itd node-yarn
コンテナが起動しているのを確認します。
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b43880150836 node-yarn "docker-entrypoint.s…" 11 minutes ago Up 11 minutes node-batch
Node.jsプログラムを実行
yarn install
Node.jsでプログラムを書く時はプラグインを使うことがほとんどかと思うので、まずはプラグインのインストールをします。
sudo docker exec node-batch yarn install
インストールが完了すればOKです。
プログラム実行
最後に、Node.jsプログラムの実行を試してみます。
作成したnode-yarnコンテナイメージは、/appディレクトリ内にbashでポイントしているだけの状態になっているので、docker execコマンドでそのままNode.jsプログラムを実行できます。
sudo docker exec node-batch node controllers/Test.js
上の例では、「node-batch」というコンテナに対して、nodeコマンドで「controllers/Test.js」というNode.jsプログラムを実行しています。
結果が出てくればOKです。
使い方
今回作成したnode-yarnイメージは汎用的なので、Node.jsアプリことにコンテナを作成して、docker execで実行することで、Node.jsをインストールしているのと同じ感覚でNode.jsアプリを動かすことがでいます。
Dockerイメージは100MBほどなので、アプリごとにNode.jsのバージョンの違うコンテナイメージをビルドして使い分けるのも便利です。
DockerでNode.js環境を構築するメリット
管理が簡単
MacでもLinuxでも、Homebrewがあれば簡単にNode.jsを入れることができますが、ビルドの時間が手間なのと、バージョン管理が煩雑というデメリットもあります。他のアプリへの影響も考慮する必要があります。
今回のように、DockerコンテナでNode.js環境を構築することで、どんな環境(ローカル or サーバー、Mac or Linuxなど)でも、即Node.jsが使えるというメリットがあります。
Node.jsのスレッドをたくさん立ち上げられる
通常は、Node.jsはシングルスレッドですが、プロセスとして処理するDockerコンテナを使うことで、複数のスレッドを立ち上げられます。
マルチコア環境では、大きなメリットになりますね。
バッチで定時処理する場合はdocker run -rmも
ただし、docker runしっぱしにしていると、適切に処理していない場合、プロセスが消えずにずっと溜まっていってメモリを圧迫してしまう場合もあるので、cronなどでバッチを定時で回す際は、docker run –rmを使うのも良いでしょう。
sudo docker run --rm -v /path/to/dir:/app -itd node-yarn node controllers/Test.js
docker rm –rmでNode.jsコマンドを実行すると、そのまま何も表示されずに終了しますが、しっかりとnodeプロセスは走っています。
このやり方の場合は、バッチ処理が終わると同時にコンテナを削除して、プロセスもkillされるので、メモリの圧迫がありません。ただし、エラーなどの場合はコンテナもプロセスも残るので、注意が必要です。
サクッとNode.js環境を構築したい方は、ぜひ試してみてください。
新着ノート
-
NUXT3
公開日:2023年2月16日
-
NUXT3
公開日:2023年1月30日
新着コード
-
Vue.js
公開日:2022年4月18日
-
Vue.js
公開日:2022年4月13日