Node.js项目Docker容器启动失败:nodemon不在$PATH路径中
执行启动命令 docker run -d -p 8000:8080 projeto-pratico-api/node 后出现如下错误:
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "nodemon": executable file not found in $PATH: unknown
问题原因
Dockerfile中使用 ENTRYPOINT ["nodemon", "server.js"] 启动服务,但默认 npm install 会将nodemon安装在项目的 node_modules/.bin 目录下,该目录不在容器的系统环境变量$PATH中,导致系统无法找到nodemon可执行文件。
另外存在端口不匹配问题:Server.js中监听的是8000端口,但Dockerfile里EXPOSE 8080,启动命令映射的是8000:8080,这会导致外部访问8000端口时无法连接到容器内的服务,需要统一端口配置。
解决方案
方案一:全局安装nodemon
修改Dockerfile,将nodemon安装到全局环境,使其加入系统$PATH:
FROM node:latest WORKDIR /app COPY . . # 全局安装nodemon后再安装项目依赖 RUN npm install -g nodemon && npm install # 统一端口:与Server.js监听的8000保持一致 EXPOSE 8000 ENTRYPOINT ["nodemon", "server.js"]
启动命令对应调整为:docker run -d -p 8000:8000 projeto-pratico-api/node
方案二:调用项目本地的nodemon
直接使用项目node_modules/.bin目录下的nodemon可执行文件:
FROM node:latest WORKDIR /app COPY . . RUN npm install EXPOSE 8000 ENTRYPOINT ["./node_modules/.bin/nodemon", "server.js"]
方案三:通过npm scripts启动
- 在项目的
package.json中添加启动脚本:
{ "scripts": { "start": "nodemon server.js" } }
- 修改Dockerfile:
FROM node:latest WORKDIR /app COPY . . RUN npm install EXPOSE 8000 ENTRYPOINT ["npm", "start"]
内容的提问来源于stack exchange,提问作者Victor Almeida

