バグ解消法、お役立ち情報など

docker-compose使用時、node_modulesが空になってしまうのを防ぐ方法

black cat

エラーについて

npmdocker-composeを組み合わせて開発をする際に、コンテナ側のnode_modulesディレクトリが空になってしまうことがあります。

この現象は、例えば下記のような構成で発生します。

ディレクトリ構造
. ├── docker │ └── type-script │ └── Dockerfile └── docker-compose.yml
docker-compose.yml
version: "3.9" services: type-script: build: context: ./docker/type-script volumes: - ./docker/type-script:/usr/app
type-script/Dockerfile
FROM 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.yml
version: "3.9" services: type-script: build: context: ./docker/type-script volumes: - ./docker/type-script:/usr/app - /usr/app/node_modules # 追記 volumes: node_modules:

volumesnode_modulesを追加しました。

そしてコンテナ側のアプリケーションと同じディレクトリ(/usr/app/)に配置します。

こうすることで、コンテナ内のnode_modulesに想定通りソースコードがインストールされます!

原因

ホスト側の全てのファイルをコンテナにマウントしてしまうと、ホスト側にソースコードがない場合はnode_modulesが空の状態でマウントされてしまうのが原因です。

ボリュームを指定してやることで、ホストとは別の場所でnode_modulesを管理してくれるので、エラーが解消された、というわけでした。

バグ解消法、お役立ち情報など