beta

バッチサーバー用の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環境を構築したい方は、ぜひ試してみてください。