簡體   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