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 抱怨找不到节点模块(其中任何一个)。我该如何解决这个问题?
在您中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;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" ]
Run Code Online (Sandbox Code Playgroud)
正如另一个答案所说,即使你已经跑npm install
了你的WORKDIR
. 当您安装该卷时,该卷的内容WORKDIR
将暂时被您的安装文件夹替换,该文件夹npm install
未运行。
当节点在多个位置搜索其所需包时,解决方法是将“已安装”node_modules
文件夹移动到根目录,这是其所需路径之一。
这样做您仍然可以更新代码,直到您需要新的包,而该映像需要另一个build
.
我引用了这个docker 示例项目中的 Dockerfile 。
归档时间: |
|
查看次数: |
17121 次 |
最近记录: |