docker,nodejs:找不到节点错误

Com*_*123 4 javascript node.js docker

(在 Ubuntu 16.04 和 Docker 1.13 上)

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

sh:1:节点:未找到

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

nodejs 出错

nodejs-legacy 错误


文件

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"]
Run Code Online (Sandbox Code Playgroud)

包.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"
  }
}
Run Code Online (Sandbox Code Playgroud)

Elv*_*vis 14

显然 CMD 应该是 JSON。我有

['node', 'app.js']
Run Code Online (Sandbox Code Playgroud)

同时应该是

["node", "app.js"]
Run Code Online (Sandbox Code Playgroud)

更改:使用双字符串引号


小智 7

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

CMD ["node", "server.js"] 
Run Code Online (Sandbox Code Playgroud)

代替

CMD ["node" "server.js"] 
Run Code Online (Sandbox Code Playgroud)


Kry*_*ten 1

@cassini 走在正确的轨道上,但我认为您没有提供足够的信息让我们准确地找出问题所在。node.js从 Ubuntu 存储库安装的方式显然有问题。事实上,我建议根本不要使用 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"]
Run Code Online (Sandbox Code Playgroud)

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

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

如果您确实想使用 Ubuntu 和存储库中的版本,那么您需要找出您构建的映像有什么问题。这意味着深入运行该映像的容器并查找节点二进制文件。

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

docker run -it --rm <image name or hash> /bin/bash
Run Code Online (Sandbox Code Playgroud)

在主机上运行此命令后,您将看到一个新的 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
Run Code Online (Sandbox Code Playgroud)