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

posted at

Docker Compose + Node でコンテナ内に node_modules を保持する

目的

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 の指定を先にしないといけないようであった.

おわり.

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?