Com*_*123 4 javascript node.js docker
(在 Ubuntu 16.04 和 Docker 1.13 上)
当我运行试图运行我的 server.js 的 dockerfile 时,出现错误:
sh:1:节点:未找到
我做了一些研究,名称 node 和 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)
@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 --version或nodejs --version看看您是否已安装它。如果有效,请尝试which node或which nodejs找到二进制文件的路径。
如果您可以找到该二进制文件,则可以编辑 Dockerfile 以包含从路径中某个位置到该二进制文件的链接。例如,假设which nodejs给您/usr/bin/nodejs,您可以在 Dockerfile 中使用 @cassini 建议的链接:
RUN ln -s /usr/bin/nodejs /usr/bin/node
Run Code Online (Sandbox Code Playgroud)