目的
Dockerfile で npm install などとすると,ビルドされたイメージ内には node_modules ディレクトリが作られることになる.しかし, Docker Compose で親ディレクトリにボリュームをマウントすると, node_modules ごと上書きされてなくなってしまう.
FROM node
WORKDIR /app
COPY package*.json ./
RUN npm install # node_modules が作られる
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.」となっている.
# 変更なしで OK
FROM node
WORKDIR /app
COPY package*.json ./
RUN npm install
services:
node:
build: ./app
volumes:
- "/app/node_modules" # ←追加
- "./app:/app"
これで,イメージのビルド時に作られた node_modules 内に保持して利用することができる.
参考記事内では node_modules という named volume を作っているが,必須ではない模様.
ただし,少なくとも筆者の環境では,ボリュームの記述順に注意しなければならない.つまり, node_modules の指定を先にしないといけないようであった.
おわり.