docker-compose使用時、node_modulesが空になってしまうのを防ぐ方法
エラーについて
npm
と docker-compose
を組み合わせて開発をする際に、コンテナ側のnode_modules
ディレクトリが空になってしまうことがあります。
この現象は、例えば下記のような構成で発生します。
ディレクトリ構造. ├── docker │ └── type-script │ └── Dockerfile └── docker-compose.yml
docker-compose.ymlversion: "3.9" services: type-script: build: context: ./docker/type-script volumes: - ./docker/type-script:/usr/app
type-script/DockerfileFROM node:19-bullseye WORKDIR /usr/app COPY package*.json ./ RUN npm i COPY . . CMD ["npm", "run", "start"]
package.json"scripts": { "start": "ts-node-dev app.ts" },
このままだと下記のようなエラーが発生します。
ターミナルts-node-dev: not found error Command failed with exit code 127.
ts-node-dev
コマンドが存在しない、というエラーです。
「Dockerfileのビルド時にインストールしているはずなのに、おかしいな」と数時間悩んでしまいました。
解決策
この問題を解決するには、以下のように記載します。
docker-compose.ymlversion: "3.9" services: type-script: build: context: ./docker/type-script volumes: - ./docker/type-script:/usr/app - /usr/app/node_modules # 追記 volumes: node_modules:
volumes
にnode_modules
を追加しました。
そしてコンテナ側のアプリケーションと同じディレクトリ(/usr/app/
)に配置します。
こうすることで、コンテナ内のnode_modules
に想定通りソースコードがインストールされます!
原因
ホスト側の全てのファイルをコンテナにマウントしてしまうと、ホスト側にソースコードがない場合はnode_modules
が空の状態でマウントされてしまうのが原因です。
ボリュームを指定してやることで、ホストとは別の場所でnode_modules
を管理してくれるので、エラーが解消された、というわけでした。