如何在 nodejs Docker 镜像上安装 Python

Ami*_*ran 12 python node.js docker dockerfile

我有一个可以在我的机器上运行的 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});
});
Run Code Online (Sandbox Code Playgroud)

上面的脚本基本上在我的 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"]
Run Code Online (Sandbox Code Playgroud)

我使用这个确切的 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)
Run Code Online (Sandbox Code Playgroud)

我尝试RUN apt-get install python -y在我的 Dockerfile 中添加一个,以便在我的 docker 映像中安装 python,我可以使用 python,但它不起作用。我是否必须FROM <image>在 Dockerfile 中添加另一个可以安装 python(我认为 node:9-slim 不知道如何安装 python,因为它没有用于那个)所以 docker 知道如何下载 python 所以我可以使用它.

此外,当我process.env.PATH在我的 docker 容器上打印时,我得到了这个:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin. 我怎么知道我有 python 处理我的图像和/或如果这是问题,我如何将它添加到我的路径中?

我是 Docker 的新手。我昨天学会了,所以如果我没有说清楚或者你需要更多信息,请PM我或发表评论。

atl*_*ine 13

事实上,这不是一个 docker 的问题,只是一个 debian 的问题。apt-get update在安装包之前你需要总是做。所以,对于你的场景,它应该是:

RUN apt-get update || : && apt-get install python -y
Run Code Online (Sandbox Code Playgroud)

根据您的评论:

W:无法获取http://deb.debian.org/debian/dists/jessie-updates/InRelease无法在发布文件中找到预期的条目“main/binary-amd64/Packages”(错误的 source.list 条目或格式错误的文件) ) E: 部分索引文件下载失败。它们已被忽略,或使用旧的代替。命令“/bin/sh -c apt-get update && apt-get install python -y”返回非零代码:100

因此,您可以添加|| :afterapt-get以忽略错误,因为当时python meta data已经完成了其他先前 url 命中的下载,因此您可以绕过错误。

更新:

一个完整可行的解决方案,以防您需要比较:

一个.py:

print("success")
Run Code Online (Sandbox Code Playgroud)

索引.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());
});
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM node:9-slim

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

WORKDIR /app
COPY . /app
CMD ["node", "index.js"]
Run Code Online (Sandbox Code Playgroud)

尝试命令:

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

  • 我还是不会用python。 (2认同)