使用 docker 和 nodeJS 构建简单应用程序时,如何修复错误“npm ERR!无法从路径或包中检测节点名称”?

use*_*114 10 docker docker-build

文件

FROM node:alpine
COPY ./ ./
RUN npm install
CMD ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)

索引.js

const express = require('express');
const app = express();
app.get('/', (req, res) => {
  res.send('Hi there');
});
app.listen(8080, () => {
  console.log("Listening on post 8080");
});
Run Code Online (Sandbox Code Playgroud)

包.json

{
  "dependencies": {
    "express": "*"
  },
  "scripts": {
    "start": "node index.js"
  }
}
Run Code Online (Sandbox Code Playgroud)

码头工人建造。

npm ERR! could not detect node name from path or package

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-11-23T23_36_35_301Z-debug.log
The command '/bin/sh -c npm install' returned a non-zero code: 1
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这不起作用。

Gin*_*pin 13

设置一个WORKDIR然后将您的文件复制到该目录:

FROM node:alpine

WORKDIR /app
COPY ./ /app

RUN npm install
CMD ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)

如文档中所述:

WORKDIR指令集的工作目录对任何RUNCMDENTRYPOINTCOPYADD它后面的Dockerfile说明。如果WORKDIR不存在,即使在任何后续 Dockerfile 指令中未使用它,也会创建它。

npmGithub 存储库上,此评论中提到一个类似的错误,作为在包目录之外运行时 npm 无法工作的问题的一部分。它似乎只涉及的新版本nodenpm(节点v15.x,NPM v7.0.x作为错误报告的):

全新安装的 Node 15.1.0 和npm i -g npm@7.0.9,由于某些(可能不相关的)原因无法正常工作。
...

24 verbose stack TypeError: could not detect node name from path or package
...
28 verbose node v15.1.0
29 verbose npm  v7.0.8
30 error could not detect node name from path or package
Run Code Online (Sandbox Code Playgroud)

但是在您的情况下,您确实有一个 package.json,所以这可能是因为build如果没有设置正确的 .json 文件,命令将无法找到它WORKDIR。因此,与其使用 来解决这个问题,不如npm确保始终设置一个WORKDIR. 无论如何都推荐使用WORKDIRDocker 最佳实践部分中提到

为了清晰和可靠,您应该始终为您的WORKDIR. 此外,您应该使用WORKDIR诸如RUN cd … && do-something难以阅读、故障排除和维护之类的激增指令。