Description
gatsbyやangularでdockerを利用する際に、OSによりinstall内容が変わるmoduleがあり、手元のnode_modulesをそのままdocker環境で利用した場合にErrorを吐く場合があった。
dockerとlocalの環境で別にinstallしようと思い、docker-ignoreに追加 + docker内部でインストールを実施した際にエラーがでたため対処方法を追記。
Refs
関係ありそうだけどさっとしか見なかった。ごめんなさい。
TL;DR
volumesにnode_modulesに追記する。
docker-compose.yml
services:
app:
volumes:
- type: volume
source: dependencies
target: /${WORK_DIRECTORY}/node_modules
command: yarn dev
volumes:
dependencies:
対処方法
node_modulesをvolumeデータとして扱う
databaseのデータと同じく、volumeにnode_moduluesを追加する。
雑に使ったdockerfile
docker/server.dockerfile
FROM node:16-alpine3.11
WORKDIR /app
COPY package*.json ./
COPY yarn.lock ./
RUN rm -rf node_modules
RUN yarn install --frozen-lockfile
簡易的に作ったdocker-compose.yml
docker-compose.yml
version: "3.9"
services:
app:
container_name: app
build:
context: .
dockerfile: ./docker/server.dockerfile
tty: true
restart: always
ports:
- "3000:3000"
volumes:
- type: bind
source: .
target: /app
- type: volume # volumeをtypeで指定
source: dependencies # volumeに記載した名前と同じもの
target: /app/node_modules # 利用しようとしている場所をtargetに記載
command: yarn dev
volumes:
db-data:
dependencies: # volumeに登録する
気付いた点
- dockerfileをXXX.dockerfileにするとVSCのファイルにiconがつく
- volumeで利用したため、複数のcontainerで使い回せる
- nocopyを使うとcontainerで相互更新しなくても利用できる
- cli系統のpackageを別のcontainerで区分けでき、 app: &node_containerで使い回しができる