docker,nodejs:找不到节点错误

时间:2017-09-20 13:48:55

标签: javascript node.js docker

(在Ubuntu 16.04和Docker 1.13上)

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

  

sh:1:节点:未找到

我做了一些研究,名称node和nodejs由于包冲突而发生了变化并导致错误;但是,当我切换到nodejs-legacy时,无法正常工作。造成这个问题的原因是什么?

error with nodejs

error with 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"
  }
}

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

@cassini走在正确的轨道上,但我认为你没有给我们足够的信息来确切地追踪问题所在。从Ubuntu存储库安装node.js的方式显然有问题。实际上,我建议不要使用Ubuntu存储库来安装node.js - 它通常提供相当旧版本的软件包,并且整个node / nodejs软件包命名问题非常混乱。这些评论都不是针对Ubuntu的:它们服务于旧软件包,因为它们尝试提供 stable 软件包,并且由于无法控制的问题而出现命名问题。

在我看来,比使用Ubuntu存储库更好的解决方案是使用官方node图片之一from the Docker repository。如果您查看该链接,您将看到它们具有各种版本和操作系统。你可以重写你的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 directly from the source。这将涉及通过Dockerfile中的wget / curl下载,解压缩并确保将其安装在正确的位置。

如果你真的想要使用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

答案 2 :(得分:0)

请确保在CMD命令数组之间使用逗号

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

代替

CMD ["node" "server.js"]