docker-composeでnodejsを効率よく扱うための方法

2020年2月25日

テクノロジー

「nodejs」と掛けまして、 「両親が共働きの女の子」と、ときます・・・ そのココロは・・・・ 鍵を握るのはJS(女子小学生)です。 謎掛けを必死で考えてみた、ユゲタです。 サーバーでjavascriptが実行できるnodejsは、扱いになれると非常に頼もしいツールになります。 そんなnodejsをdockerを使って環境構築したいと思ったら、意外とめんどくさかったので、僕の行った方法を書き記しておきます。

docker-composeの各種ソースコード

/ ├ docker-compose.yml └ nodejs/ └ Dockerfile version: '3' services: nodejs: container_name: "node" working_dir: "/var/www/html" build: context: ./nodejs/. ports: - "8080:8080" - "8880:8880" volumes: - ~/web:/var/www/html command: run.js tty: true FROM node:12.4.0-alpine RUN apk add --no-cache yarn $ docker-compose up -d

解説

僕の環境の場合は、ローカルフォルダの"~/web"をwebソースコード用のフォルダに固定しているので、それをdockerコンテナ内の"/var/www/html/"のシンボリックになるようにセットしています。 ご自身の環境に合わせた内容に書き換えてお使いください。 そして、nodejsのコンテナ起動で難しかった点としては、"docker-compose up -d"と-dオプションを付けても永続起動できてなくて、すぐに終了して"Exit"になっていましたが、 "docker-compose.yml"の最後に書いている"tty: true"を付けることによって、この問題が解消できました。 この設定は、upする時の永続起動してくれる命令だったんですね。 さらに、実際のnodejsのプログラムを永続的に動かす時に、foreverを使って動かしていたんですが、そのまま起動コマンドで書いた所、コマンドが実行されると、サーバーが終了してしまう現象が発生していました。 どうやらこれは、サーバーが無限ループを発生させていて、dockerコンテナは自動的に終了をしているという状態らしいです。 nodejsで"socket.io"などを使う場合などは永続起動が必要なので、どうすればいいか悩んでいたんですが、実はforeverを使わずに、そのままnodejsプログラムを起動すると、待受状態になってくれることが分かりました。 dockerを使った方がシンプルに構築できるなんて、思いも寄らないメリットでした。 本番環境でも、こうしたメリットが利用できるdockerを使うというのは悪くないですね。