2017/07/24

Dockerのコンテナ内でNode.jsアプリを実行し処理結果だけを返す

photo by Daniel Ramirez

Node.jsでツールをつくって公開するとき、または公開されているツールを使うとき、いちいちnodeの実行環境を整え、npmで大量のnode_modulesをインストールしなければならない。
普段からNode.jsの環境を整えている人ならいいけど、ためしに使ってみようかな?と思う層にはハードルがちょっと高い気がする。


ローカル環境を汚さず、もっと簡単に実行できないか?


と考えた結果、Dockerのコンテナに実行環境をつくり、処理結果だけを返してくれるようにすれば便利なんじゃない?と思いついたので当記事で方法を紹介する。

Node.jsの実行用コンテナをつくる


DockerでNode.jsの実行用コンテナをつくるためにDockerfileを書く。

DockerfileとはDockerのコンテナをつくるための設計書みたいなもの。
ここにどんなOSで、何をインストールして、何を実行するかを記せる。


ディレクトリ構成は以下のとおり。
.
├── Dockerfile
├── .dockerignore
├── index.js
└── package.json


今回は、Node.jsを動かせるだけのもっともシンプルなコンテナを作りたかったので、Alpine Linuxというサイズが3-4MBしかない極小Linuxを使う。

Dockerfile
FROM alpine

ADD ./ /root/{my-node-project}

WORKDIR /root/{my-node-project}

RUN apk --update add nodejs-npm &&\
    apk --no-cache add &&\
    npm install

ENTRYPOINT ["node", "index.js"]

Alpine Linuxをベースにして、ローカルのNode.jsのプロジェクトファイル({my-node-project})コンテナに追加している。
apkでnodejs-npmをインストールして、npm installで必要なライブラリをインストール。
最後にコンテナ起動時に実行されるコマンド「node index.js」を定義するという、シンプルなDockerfileだ。


コンテナにローカルのファイルを追加するときに不要なファイル(node_modulesなど)があると、イメージ作成の際に時間がかかってしまう。
そこで、.dockerignoreファイルに除去したいファイル・ディレクトリのリストを書く。

.dockerignore
node_modules

書き方は.gitignoreと同じ。含めたくないファイルやディレクトリを指定する。
.dockerignoreを使った場合と使わなかった場合では、以下のような差がある。
# .dockerignoreなし
$ docker build -t tag .
Sending build context to Docker daemon  19.44MB

# .dockerignoreあり
$ docker build -t tag .
Sending build context to Docker daemon  71.68kB

この実行結果は、とあるNode.jsのプロジェクトをコンテナに追加したときのものだ。
node_modulesディレクトリを含めるかどうかで18MBも変わっている。

とくにnode_modulesは容量が大きくなりやすいので、.dockerignoreに書いておくことをオススメする。


追記: 2017/07/27 7:00
はてなブックマークで次のコメントをいただいた。ありがとうございます。
Dockerのコンテナ内でNode.jsアプリを実行し処理結果だけを返す | Black Everyday Company
c/c++ がないとインストールに失敗するモジュールもあるので、node:8.2-alpine とかをベースイメージにしたほうが簡単で汎用性があると思う。
2017/07/26 18:30
nodeの環境は、とりあえずnodejs-npm入れておけばいいだろうと思っていたのだが…。
node:8.2-aplineを使うバージョンのDockerfileは以下のとおり。

Dockerfile
FROM node:8.2-alpine

ADD ./ /root/{my-node-project}

WORKDIR /root/{my-node-project}

RUN npm install

ENTRYPOINT ["node", "index.js"]




imageを作成し、コンテナを起動する


Dockerfileもできたので、あとはビルドしてimageを作成し、コンテナを起動するだけ。
# Node.jsのプロジェクトに移動
$ cd my-node-project

# my-app-tagという名前のタグをつけてDockerfileをビルド
$ docker build -t my-app-tag .

# コンテナを実行する
$ docker run --rm -t my-app-tag
コンテナからの出力(console.log()をしたものが表示される)

docker buildでimageを作成し、docker runで作成したイメージからコンテナを作成・起動する。
今回はNode.jsの実行結果が欲しいだけで、実行後はコンテナはいらないので--rmオプションをつけて削除している。



以上

written by @bc_rikko

0 件のコメント :

コメントを投稿