🐳
docker composeでのnode_modules問題を解決する
これは何?
docker composeを利用した開発環境を用意するにあたりnode_modules
の扱いが結構面倒なので、コピペして使いまわせるようにしておきたい。
やりたいことはコンテナ上で管理してるnode_modules
をホストにも持ってきたい(dev containerの設定、都度docker cpしたくないという怠惰)。
詳細の解説は参考にさせていただいた記事や公式ドキュメントに任せたい。
諸々の構成ファイル
記事を簡単にするために以下のようなディレクトリ構成を題材(Next.jsを使ったプロジェクトのつもり)にする。
.
├── compose.yaml
├── app.Dockerfile.dockerignore
├── app.local.Dockerfile.dockerignore
├── docker
│ └── app
│ ├── app.Dockerfile. # 検証・本番環境用
│ └── app.local.Dockerfile # 開発環境用
└── app
├── package-lock.json
├── package.json
└── ... アプリケーションコード諸々
compose.yaml
services:
app:
container_name: app
build:
context: .
dockerfile: ./docker/app/app.local.Dockerfile
ports:
- "3000:3000"
volumes:
- ./app:/usr/src/app:cached
- node_modules:/usr/src/app/node_modules
command: npm run dev
environment:
- WATCHPACK_POLLING=true
volumes:
node_modules:
driver: local
driver_opts:
type: none
device: ${PWD}/app/node_modules
o: bind
app.local.Dockerfile
# syntax=docker/dockerfile:1
FROM node:22.8.0-alpine3.20
WORKDIR /usr/src/app
RUN apk update && \
apk add --no-cache wget git unzip vim curl python make g++
COPY ./app/package*.json .
RUN npm i
ENV NODE_ENV=development
ポイント
-
node_modules
を名前付きvolumeに指定
app:
volumes:
- ./app:/usr/src/app:cached
- node_modules:/usr/src/app/node_modules
- 名前付きvolumeをホストにマウントする設定
volumes:
node_modules:
driver_opts:
type: none
device: ${PWD}/app/node_modules
o: bind
※driverはデフォルトでlocalなので特に指定しなくても良いかもだが、動作に問題がある際は指定するのが無難
参考にさせていただいた資料
Docker周りのおまけ資料
コンテナ化が当たり前になってきているのでこのあたりは押さえておきたい。今回は開発環境用のコンテナだったのでrootユーザーのままにしている(開発中にパッケージ更新周りとかで面倒になるのでサボった)が、権限まわりとかは特に気をつけないと。。。
Discussion