如何在Node.js Docker镜像上安装Python

22

我有一个 Node.js 应用程序,在我的机器上工作正常,因为我已经安装了 Python 并将其添加到全局环境变量 PATH 中 (也在 process.env.PATH 中),所以我可以运行:

const spawn = require("child_process").spawn;
 console.log('PATH:::::');
 console.log(process.env.PATH);
 const pythonProcess = spawn('python', ["./detect_shapes.py", './example2.png']);
 pythonProcess.stdout.on('data', (data) => {
 console.log('DATA::::');
 console.log(data);
 res.render('index', {data});
});

上面的脚本基本上在我的Node.js应用程序内部运行一个单独的Python脚本,并返回响应。我可以运行任何机器上可以找到的基本命令,例如:const pythonProcess = spawn('ls');。这行代码将运行ls命令并返回文件,正如预期的那样。

我还有一个像这样的Dockerfile

FROM node:9-slim
WORKDIR /app 
COPY . /app 
RUN npm install 
EXPOSE 3000 
CMD ["node", "index.js"]

我使用了这个确切的Dockerfile配置创建了nodejs应用程序,并且它也能正常工作,但由于我正在使用child_process.spawn函数,所以它可能不知道Python或其路径,因此我遇到了这个错误:

Error: spawn python ENOENT
 at Process.ChildProcess._handle.onexit (internal/child_process.js:201:19)
 at onErrorNT (internal/child_process.js:379:16)
 at process._tickCallback (internal/process/next_tick.js:178:19)
Emitted 'error' event at:
 at Process.ChildProcess._handle.onexit (internal/child_process.js:207:12)
 at onErrorNT (internal/child_process.js:379:16)
 at process._tickCallback (internal/process/next_tick.js:178:19)
我在我的Dockerfile中尝试添加RUN apt-get install python -y以便安装python并在docker映像中使用它,但是这不起作用。我需要添加另一个FROM <image>来安装Python吗?(我认为node:9-slim不知道如何安装Python,因为它没有用于安装Python的功能)。这样Docker就能知道如何下载Python,以便我可以使用它。
此外,当我在Docker容器上打印process.env.PATH时,我得到以下内容:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。如果这是问题,我该如何知道我的镜像中有Python工作,并且/或者如何将其添加到我的路径中?
我对Docker很陌生。昨天我才学会,所以如果我没有表述清楚或者您需要更多信息,请私信我或留言。

运行 apt-get install python -y 应该可以,出现了什么错误? - atline
@atline 我收到的错误是:E: 无法找到软件包python 命令'/bin/sh -c apt-get install python'返回非零代码:100。我需要按照以下顺序进行吗:FROM node:9-slim RUN apt-get install python WORKDIR /app COPY . /app RUN npm install EXPOSE 3000 CMD ["node", "index.js"] - Amir Šaran
当我尝试使用以下命令构建镜像时出现错误:docker build -t myname/somename . - Amir Šaran
1个回答

29

实际上,这不是一个docker问题,而是一个debian问题。在安装软件包之前,您需要始终执行apt-get update。因此,在您的情况下,应该是:

RUN apt-get update || : && apt-get install python -y

根据您的评论:

W: 无法获取 http://deb.debian.org/debian/dists/jessie-updates/InRelease 发现 Release 文件中缺少预期条目 'main/binary-amd64/Packages' (源列表条目错误或文件格式不正确) E: 一些索引文件下载失败。它们已被忽略,或者使用旧的文件替代了。执行命令 '/bin/sh -c apt-get update && apt-get install python -y' 返回非零代码:100

因此,您可以在apt-get之后添加|| :以忽略错误,此时python meta data已经与其他先前的url请求一起下载完成,因此您可以绕过错误。

更新:

如果需要比较,则有一个完整的可行解决方案:

a.py:

print("success")

index.js:

const spawn = require("child_process").spawn;
console.log('PATH:::::');

console.log(process.env.PATH);
const pythonProcess = spawn('python', ['/app/a.py']);
pythonProcess.stdout.on('data', (data) => {
    console.log('DATA::::');
    console.log(data.toString());
});

pythonProcess.stderr.on('data', (data) => {
    console.log("wow");
    console.log(data.toString());
});

Dockerfile:

FROM node:9-slim

RUN apt-get update || : && apt-get install python -y

WORKDIR /app
COPY . /app
CMD ["node", "index.js"]

尝试命令:

orange@orange:~/gg$ docker build -t abc:1 .
Sending build context to Docker daemon  4.096kB
...
Successfully built 756b13952760
Successfully tagged abc:1

orange@orange:~/gg$ docker run abc:1
PATH:::::
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DATA::::
success

当我将该命令添加到我的Dockerfile中时,出现以下错误:`W: Failed to fetch http://deb.debian.org/debian/dists/jessie-updates/InRelease Unable to find expected entry 'main/binary-amd64/Packages' in Release file (Wrong sources.list entry or malformed file)E: Some index files failed to download. They have been ignored, or old ones used instead. The command '/bin/sh -c apt-get update && apt-get install python -y' returned a non-zero code: 100`。 - Amir Šaran
2
我仍然无法使用Python。 - Amir Šaran
@atline 感谢您的回答。您是如何确定基础镜像 node:9-slim 是 Debian,而不是其他 Linux 发行版,比如 CentOS(这样我们就需要使用 yum)? - flow2k
1
@flow2k 通常我们遇到这种问题有两种方法:1)docker run -it node:9-slim /bin/bash,然后在容器中使用类似cat /etc/issue的命令来获取操作系统。2)直接在Dockerhub上找到镜像,然后从Dockerhub找到github链接,例如:https://github.com/nodejs/docker-node/blob/a9c583095d4cf08bbd68f570a1f9a99780820351/10/stretch-slim/Dockerfile,您可以看到node:slim的一个示例,它使用debian系统。 - atline
你应该安装python3.x - martin
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接