(在Ubuntu 16.04和Docker 1.13上)
当我运行试图运行我的server.js的dockerfile时,出现错误:
sh:1:节点:未找到
我做了一些研究,名称node和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"
}
}
答案 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 --version
或nodejs --version
,看看您是否安装了它。如果可行,请尝试which node
或which 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"]