Docker 容器内的 Nodemon

Jum*_*mpa 7 node.js docker nodemon dockerfile docker-container

我正在尝试在 docker 容器中使用 nodemon:

文件

FROM node:carbon
RUN npm install -g nodemon
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "nodemon" ]
Run Code Online (Sandbox Code Playgroud)

构建/运行命令

docker build -t tag/apt .
docker run -p 49160:8080 -v /local/path/to/apt:/usr/src/app -d tag/apt
Run Code Online (Sandbox Code Playgroud)

将本地卷附加到容器以观察代码更改,会导致一些覆盖和 nodemon 抱怨找不到节点模块(其中任何一个)。我该如何解决这个问题?

whi*_*s11 9

在您中Dockerfile,您npm install在复制package*json文件后正在运行。一个node_modules目录被正确创建/usr/src/app,你很高兴。

但是,当您将本地目录挂载到 上时/usr/src/app,容器内该目录的内容将被节点项目的本地版本覆盖,该版本显然缺少该node_modules目录,从而导致您遇到错误。

npm install挂载目录后,您需要在正在运行的容器上运行。例如,您可以运行以下内容:

docker exec -ti <containername> npm install
Run Code Online (Sandbox Code Playgroud)

请注意,您必须暂时CMD指令更改为以下内容:

CMD ["sleep", "3600"]
Run Code Online (Sandbox Code Playgroud)

为了能够进入容器。

这将导致在您的本地目录中创建一个 node_modules 目录,并且您的容器应该正确运行 nodemon (切换回当前的CMD)。


小智 7

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" ]
Run Code Online (Sandbox Code Playgroud)

正如另一个答案所说,即使你已经跑npm install了你的WORKDIR. 当您安装该卷时,该卷的内容WORKDIR将暂时被您的安装文件夹替换,该文件夹npm install未运行。

当节点在多个位置搜索其所需包时,解决方法是将“已安装”node_modules文件夹移动到根目录,这是其所需路径之一。

这样做您仍然可以更新代码,直到您需要新的包,而该映像需要另一个build.

我引用了这个docker 示例项目中的 Dockerfile 。