36
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Organization

Docker で Node.js 開発環境を簡単に用意する

概要

Docker を使って、ローカルを汚すことなく Node.js の開発環境を作る方法です。数行の docker-compose.yml を書いて、あとは随時コンテナを起動してコマンドを実行するだけです。

環境

  • macOS Mojave v10.14.2
  • Docker Desktop Community v2.0.0.2

手順

  1. Docker Desktop をインストールします。
  2. 開発用ディレクトリ(Git リポジトリ等)を用意します。
  3. docker-compose.yml を書きます。

手順 1、2 については特に説明は不要だと思うので省略します。

docker-compose.yml を書く

以下を書きます。

docker-compose.yml
version: '3'
services:
  app:
    image: node:11.8.0
    ports:
      - $PORT:$PORT
    volumes:
      - ./:/src
    working_dir: /src
.env
PORT=8080
  • app — サービス名。好きな名前を付けます。
  • image — Docker の公式イメージを使います。バージョンは開発する目的に合わせて指定してください。
  • ports — Express を使って Web サーバを立てる場合など、ホスト・ゲスト間で通信が必要な場合はポートを指定します。今回は環境変数で指定できるようにしました。
  • volumes — ホスト側のディレクトリをゲストにマウントします。
  • working_dir — コンテナ起動後のカレントディレクトリを指定します。npm install を実行する package.json があるディレクトリを指定するとよいでしょう。

以上で準備完了です!

必要な場合はビルドを

パッケージマネージャに Yarn を使用するなど、Node.js のイメージに何かをインストールする必要がある場合は、Dockerfile を書いてビルドしておきます。

実行

あとは docker-compose run --rm <サービス名> <コマンド> で Node.js を使った何かを随時実行するだけです(以下、サービス名を app とします)。--rm オプションは、コマンド終了後にコンテナを自動的に削除してくれます。

npm で任意のライブラリをインストールする

docker-compose run --rm app npm install <パッケージ名>

package.json の依存ライブラリをインストールする

開発環境を他の人に提供するときなど。

docker-compose run --rm app npm install

package.json で定義したスクリプトを実行する

Express で Web サーバを起動するなど、package.json で定義したスクリプトを実行する場合。

package.json
{
  "scripts": {
    "start": "node --experimental-modules index.mjs"
  }
}

docker-compose.yml の ports で指定したポートを通すには --service-ports オプションを付けます。

docker-compose run --rm --service-ports app npm start

よく使うコマンドはシェルスクリプトで

毎回 docker-compose run --rm app ... と打つのは面倒なので、よく使うコマンドはシェルスクリプトにしておくとよいです。

例えば、開発環境を構築するためのコマンドを一つのシェルスクリプトに書いておくことで、他の人が開発環境を簡単に準備できるようになります。

prepare.sh
#!/bin/bash

echo 'PORT=8080' >> .env && \
docker-compose run --rm app npm install

まとめ

  • docker-compose.yml で Node.js のイメージとボリューム、ワーキングディレクトリ等を定義します。
  • docker-compose run --rm <サービス名> <コマンド> で随時コンテナ作成、コマンド実行、コンテナ削除を行います。

それでは、快適な Docker ライフを!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
36
Help us understand the problem. What are the problem?