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