web-dev-qa-db-ja.com

Dockerコンテナ内のNodemon

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はノードモジュール(それらのいずれか)を見つけることができないと文句を言います。どうすればこれを解決できますか?

5
Jumpa

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に戻った後)。

6
whites11

TL; DRnpm 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" ]

他の答えが言ったように、あなたがあなたのWORKDIRnpm installを実行したとしても。ボリュームをマウントすると、WORKDIRの内容は、npm installが実行されなかったマウントフォルダーに一時的に置き換えられます。

ノードがその サーバーの場所にあるrequireパッケージ を検索するとき、回避策は 'installed' node_modulesフォルダーをそのrequireパスの1つであるルートに移動することです。

そうすることで、イメージに別のbuildが必要な新しいパッケージが必要になるまで、コードを更新できます。

これからDockerfileを参照します dockerサンプルプロジェクト

2
metro