[英]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.