目的
Dockerfile で npm install
などとすると,ビルドされたイメージ内には node_modules
ディレクトリが作られることになる.しかし, Docker Compose で親ディレクトリにボリュームをマウントすると, node_modules
ごと上書きされてなくなってしまう.
app/Dockerfile
FROM node
WORKDIR /app
COPY package*.json ./
RUN npm install # node_modules が作られる
docker-compose.yml
services:
node:
build: ./app
volumes:
- "./app:/app" # node_modules が上書きされてしまう
今まではこれを回避するために
docker compose build
docker compose run npm install # ホスト側にも node_modules を作る
などと二度手間を踏んでいたが,これを回避できる, i.e., イメージのビルド時にインストールした node_modules
をコンテナ内に保持できる方法を知ったので,備忘録として残す.
やりかた
Docker Compose の bind mounts から node_modules を除外する方法 を参考にさせていただいた.記事内では「方法B.」となっている.
app/Dockerfile
# 変更なしで OK
FROM node
WORKDIR /app
COPY package*.json ./
RUN npm install
docker-compose.yml
services:
node:
build: ./app
volumes:
- "/app/node_modules" # ←追加
- "./app:/app"
これで,イメージのビルド時に作られた node_modules
内に保持して利用することができる.
参考記事内では node_modules
という named volume を作っているが,必須ではない模様.
ただし,少なくとも筆者の環境では,ボリュームの記述順に注意しなければならない.つまり, node_modules
の指定を先にしないといけないようであった.
おわり.