(在 Ubuntu 16.04 和 Docker 1.13 上)
当我运行试图运行 server.js 的 dockerfile 时,出现错误:
sh:1:节点:未找到
我做了一些研究,名称 node 和 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 许可协议
@cassini 走在正确的轨道上,但我认为您没有提供足够的信息让我们准确找出问题所在。从 Ubuntu 存储库安装
node.js
的方式显然有问题。事实上,我建议根本不要使用 Ubuntu 存储库来安装node.js
- 它通常提供相当旧版本的软件包和整个node
/nodejs
命名问题很混乱。这些评论都不是为了打击 Ubuntu:他们提供旧包是因为他们试图提供 稳定 的包,而命名问题是由于他们无法控制的问题而出现的。在我看来,比使用 Ubuntu 存储库更好的解决方案是使用 来自 Docker 存储库 的官方
node
图像之一。如果您查看该链接,您会发现它们有各种各样的版本和操作系统可用。您可以重写 Dockerfile 使其看起来像这样:顺便说一句……如果你想要一个小图像,Alpine linux 图像很好。 Ubuntu 映像的大小将达到数百兆字节,而 Alpine 映像将小得多。缺点是它不是基于 Debian 的,因此您必须习惯一些怪癖。
但是,如果您真的想使用
node.js
继续使用您自己的基于 Ubuntu 的映像,我会首先考虑 直接从源 安装node.js
。这将涉及通过wget
/curl
在你的 Dockerfile 中下载,解压它,并确保它安装在正确的位置。如果你 真的 想使用 Ubuntu 和存储库中的版本,那么你需要弄清楚你构建的图像有什么问题。这意味着深入运行此图像的容器并找到节点二进制文件。
要获得对容器的 shell 访问权限:
在您的主机上运行此命令后,您将看到一个新的 bash shell 提示符。恭喜!您现在可以通过 shell 访问基于您的映像的临时容器。现在您需要四处寻找,看看是否可以运行或找到该二进制文件。
试试
node --version
或nodejs --version
看看你是否安装了它。如果可行,请尝试which node
或which nodejs
以找到二进制文件的路径。如果可以找到二进制文件,则可以编辑 Dockerfile 以包含从路径中某处到该二进制文件的链接。例如,假设
which nodejs
给你/usr/bin/nodejs
,你可以在 Dockerfile 中使用@cassini 建议的链接: