Dockerコンテナ内でnodemonを使用しようとしています:
Dockerfile
FROM node:carbon
RUN npm install -g nodemon
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "nodemon" ]
ビルド/実行コマンド
docker build -t tag/apt .
docker run -p 49160:8080 -v /local/path/to/apt:/usr/src/app -d tag/apt
コードの変更を監視するためにローカルボリュームをコンテナにアタッチすると、いくつかのオーバーライドが発生し、nodemonはノードモジュール(それらのいずれか)を見つけることができないと文句を言います。どうすればこれを解決できますか?
Dockerfile
では、npm install
ファイルをコピーした後にpackage*json
を実行しています。 node_modules
ディレクトリが/usr/src/app
に正しく作成され、準備が整いました。
ただし、ローカルディレクトリを/usr/src/app
にマウントすると、コンテナ内のそのディレクトリの内容が、ローカルバージョンのノードプロジェクトで上書きされます。これには、明らかにnode_modules
ディレクトリがないため、エラーが発生します。経験しています。
ディレクトリをマウントした後、実行中のコンテナでnpm install
を実行する必要があります。たとえば、次のようなものを実行できます。
docker exec -ti <containername> npm install
一時的にCMD
命令を次のように変更する必要があることに注意してください。
CMD ["sleep", "3600"]
コンテナに入ることができるようにするため。
これにより、node_modulesディレクトリがローカルディレクトリに作成され、コンテナはnodemonを正しく実行する必要があります(現在のCMD
に戻った後)。
TL; DR:npm install
フォルダーをルートに移動しながらサブフォルダー内のnode_modules
。
この設定を試してみてください。役立つはずです。
FROM node:carbon
RUN npm install -g nodemon
WORKDIR /usr/src/app
COPY package*.json /usr/src/app/
RUN npm install && mv /usr/src/app/node_modules /node_modules
COPY . /usr/src/app
EXPOSE 8080
CMD [ "nodemon" ]
他の答えが言ったように、あなたがあなたのWORKDIR
でnpm install
を実行したとしても。ボリュームをマウントすると、WORKDIR
の内容は、npm install
が実行されなかったマウントフォルダーに一時的に置き換えられます。
ノードがその サーバーの場所にあるrequireパッケージ を検索するとき、回避策は 'installed' node_modules
フォルダーをそのrequireパスの1つであるルートに移動することです。
そうすることで、イメージに別のbuild
が必要な新しいパッケージが必要になるまで、コードを更新できます。
これからDockerfileを参照します dockerサンプルプロジェクト 。