node+nodemonのdockerコンテナ


node + nodemon の開発用コンテナを作成した。実行環境はwin10とdocker-machine

.
├── app.js
├── docker-compose.yml
├── Dockerfile
├── package-lock.json
├── package.json
└── node_modules
#Dockerfile

FROM node:12

WORKDIR /app

# ホストのpackage.jsonとpackage-lock.jsonを
# コンテナの/appにコピー
COPY ./package*.json ./

CMD bash -c "npm install && npm run dev"
docker-compose.yml
version: '3.3'

volumes:
  node_modules:

services:
  app:
    build: .
    container_name: node
    ports:
      - '80:8081'
    restart: always
    volumes:
      # ホストのdocker-compose.ymlがあるディレクトリを
      # コンテナの/appマウントする
      - '.:/app'
      # ただしnode_modulesだけ除外するためnode-mudulesボリュームを
      # コンテナの/app/node_modulesにマウントする
      # コンテナ内でnpm install してもホストのnode_modulesは空のまま
      - 'node_modules:/app/node_modules'
    # 下2行はdocker run コマンドの-itオプションに相当する
    # 無いとコンテナが停止してしまう
    tty: true
    stdin_open: true
package.json
{
  "name": "hoge",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "node ./app.js",
    "dev": "nodemon -L ./app.js"
  },
  "dependencies": {
    "express": "^4.16.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.4"
  },
  "author": "",
  "license": "ISC"
}

以下のようにしてDockerfileでnpm startするとnodemonは機能しなかった。startキーではダメ。さらに-Lオプションが必要。

 "scripts": {
    "start": "nodemon ./app.js"
  }

起動コマンドなど

コンテナ起動

docker-compose up -d

node_modulesボリュームは自動で作成される。project_node_modulesという名前になる。docker-machineのIPアドレスでブラウザからnodeサーバーにアクセスできる

nodemonが機能してることを確認する

docker-compose logs -f

または

docker logs node -f

コンテナ削除

docker-compose down --rmi all

--rmi all でイメージも削除される

node_modulesボリュームを削除

docker volue rm project_node_modules

ボリューム名を確認

docker volume ls

docker-machineのIPを調べる

docker-machine ls

または

docker-machine ip
docker-machine ip default