繁体   English   中英

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

[英]How to install Python on nodejs Docker image

我有一个可以在我的机器上运行的nodejs应用程序,因为我已经安装了python,并且它在全局env 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});
});

上面的脚本基本上在我的nodejs应用程序中运行一个单独的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以便在docker映像中安装python,并且可以使用python,但是它不起作用。 我是否必须在Dockerfile中添加另一个可以安装python的FROM <image> (我认为node:9-slim不知道如何安装python,因为它不用于此),所以docker知道如何下载python。我可以用

同样,当我在Docker容器上打印process.env.PATH ,我得到了这个信息: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 我怎么知道我的图像上正在使用python和/或如果这是问题,如何将其添加到路径中?

我是Docker的新手。 我是昨天学到的,所以如果我不清楚的话,或者您需要更多信息,请PM我或发表评论。

实际上,这不是docker问题,只是一个debian问题。 在安装软件包之前,您需要始终执行apt-get update 因此,对于您来说,它应该是:

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

根据您的评论:

W:无法获取http://deb.debian.org/debian/dists/jessie-updates/InRelease无法在发行文件中找到预期的条目“ main / binary-amd64 / Packages”(错误的sources.list条目或格式错误的文件) )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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM