泊坞窗,nodejs:节点未find错误

(在Ubuntu 16.04和Docker 1.13上)

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

sh:1:节点:找不到

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

与nodejs错误

与nodejs-legacy错误


DockerFile

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"] 

的package.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" } } 

@cassini是正确的,但我不认为你已经提供了足够的信息来帮助我们find问题所在。 从Ubuntu存储库安装node.js的方式显然有些问题。 实际上,我build议不要使用Ubuntu存储库来安装node.js – 它通常服务于相当旧的软件包版本,而整个node / nodejs软件包的命名问题相当混乱。 这些评论都不是为了打击Ubuntu:他们服务于旧的软件包,因为他们试图服务于稳定的软件包,并且命名问题是由于他们无法控制的问题而出现的。

在我看来,比使用Ubuntu存储库更好的解决scheme是使用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"] 

顺便说一句,如果你想要一个小图像,那么阿尔卑斯山的Linux图像是很好的。 Ubuntu的图像大小将达到几百兆,而Alpine图像的大小则要小得多。 缺点是它不是基于Debian的,所以有一些怪癖,你将不得不习惯。

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

如果你真的想使用Ubuntu和版本库中的版本,那么你需要弄清楚你的图像出了什么问题。 这意味着潜入一个运行这个映像的容器并find节点二进制文件。

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

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

一旦你在你的主机上运行这个命令,你将会看到一个新的bash shell提示符。 恭喜! 您现在可以通过shell来访问基于映像的临时容器。 现在你需要捅一下,看看你是否可以运行或find二进制文件。

试试node --version或者nodejs --version来看看你是否安装了它。 如果which nodejs ,请尝试使用which nodewhich node来查找二进制文件的path。

如果你能find这个二进制文件,你可以编辑你的Dockerfile来包含从你的二进制文件的path中的某个链接。 例如,假设which nodejs给你/usr/bin/nodejs ,你可以在你的Dockerfile中使用@cassinibuild议的链接:

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

您需要手动添加一个新的符号链接,它将指向nodejs。 示例(请检查nodejs路由, / usr / bin / nodejs是默认路由):

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