docker,nodejs:找不到节点错误

新手上路,请多包涵

(在 Ubuntu 16.04 和 Docker 1.13 上)

当我运行试图运行 server.js 的 dockerfile 时,出现错误:

sh:1:节点:未找到

我做了一些研究,名称 node 和 nodejs 由于包冲突而被更改并导致错误;但是,当我切换到 nodejs-legacy 时,它不起作用。是什么导致了这个问题?

nodejs 错误

nodejs-legacy 错误


Docker文件

FROM ubuntu
RUN apt-get update
RUN apt-get install nodejs -y
#RUN rm -f package-lock.json
RUN apt-get install npm -y
RUN apt-get install apt-utils -y

WORKDIR /usr/scr/app

COPY package.json package-lock.json /usr/src/app/
COPY . .

EXPOSE 8080
CMD ["npm", "start"]


包.json

 {
 "name": "iam",
 "version": "1.0.2",
 "description": "Identity and access management.",
 "main": "server.js",
 "scripts": {"start": "node server.js" },
 "author": "",
 "license": "ISC",

 "dependencies": {
    "body-parser": "^1.17.2",
    "cors": "^2.8.3",
    "express": "^4.15.3",
    "jsonwebtoken": "^7.4.1",
    "ldapjs": "^1.0.1"
  }
}

原文由 ComputerGuy123 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 341
2 个回答

@cassini 走在正确的轨道上,但我认为您没有提供足够的信息让我们准确找出问题所在。从 Ubuntu 存储库安装 node.js 的方式显然有问题。事实上,我建议根本不要使用 Ubuntu 存储库来安装 node.js - 它通常提供相当旧版本的软件包和整个 node / nodejs 命名问题很混乱。这些评论都不是为了打击 Ubuntu:他们提供旧包是因为他们试图提供 稳定 的包,而命名问题是由于他们无法控制的问题而出现的。

在我看来,比使用 Ubuntu 存储库更好的解决方案是使用 来自 Docker 存储库 的官方 node 图像之一。如果您查看该链接,您会发现它们有各种各样的版本和操作系统可用。您可以重写 Dockerfile 使其看起来像这样:

 # the Debian wheezy image with node 8.5.0 installed
FROM node:8.5.0-wheezy

# looks like you have a typo here... changed /usr/scr/app to /usr/src/app
WORKDIR /usr/src/app

COPY package.json package-lock.json /usr/src/app/
COPY . .

EXPOSE 8080
CMD ["npm", "start"]

顺便说一句……如果你想要一个小图像,Alpine linux 图像很好。 Ubuntu 映像的大小将达到数百兆字节,而 Alpine 映像将小得多。缺点是它不是基于 Debian 的,因此您必须习惯一些怪癖。

但是,如果您真的想使用 node.js 继续使用您自己的基于 Ubuntu 的映像,我会首先考虑 直接从源 安装 node.js 。这将涉及通过 wget / curl 在你的 Dockerfile 中下载,解压它,并确保它安装在正确的位置。

如果你 真的 想使用 Ubuntu 和存储库中的版本,那么你需要弄清楚你构建的图像有什么问题。这意味着深入运行此图像的容器并找到节点二进制文件。

要获得对容器的 shell 访问权限:

 docker run -it --rm <image name or hash> /bin/bash

在您的主机上运行此命令后,您将看到一个新的 bash shell 提示符。恭喜!您现在可以通过 shell 访问基于您的映像的临时容器。现在您需要四处寻找,看看是否可以运行或找到该二进制文件。

试试 node --versionnodejs --version 看看你是否安装了它。如果可行,请尝试 which nodewhich nodejs 以找到二进制文件的路径。

如果可以找到二进制文件,则可以编辑 Dockerfile 以包含从路径中某处到该二进制文件的链接。例如,假设 which nodejs 给你 /usr/bin/nodejs ,你可以在 Dockerfile 中使用@cassini 建议的链接:

 RUN ln -s /usr/bin/nodejs /usr/bin/node

原文由 Kryten 发布,翻译遵循 CC BY-SA 3.0 许可协议

确保在 CMD 命令数组之间有一个逗号

CMD ["node", "server.js"]

代替

CMD ["node" "server.js"]

原文由 Rishab Surana 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题