Как установить Python на образ Docker nodejs - PullRequest
0 голосов
/ 06 июля 2019

У меня есть приложение 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});
});

Сценарий, приведенный выше, в основном запускает отдельный скрипт python внутри моего приложения nodejs и возвращает ответ на него. Я могу запустить основные команды, которые можно найти на любой машине, например: const pythonProcess = spawn('ls');. Эта строка кода запускает команду ls и возвращает файлы, как ожидается.

У меня тоже есть Dockerfile вот так:

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

Я создал приложения nodejs с этой точной конфигурацией Dockerfile, и это сработало, поскольку я использую функции 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 apt-get install python -y в свой Dockerfile, чтобы он установил python в образ докера, и я могу использовать python, но это не работает. Должен ли я добавить еще один FROM <image>, который может установить python (я думаю, что узел: 9-slim не знает, как установить python, поскольку он не используется для этого) в Dockerfile, чтобы docker знал, как загрузить python, чтобы я можно использовать.

Также, когда я печатаю process.env.PATH на моем док-контейнере, я получаю это: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin. Как я могу узнать, что у меня есть python, работающий с моим изображением и / или как я могу добавить его к своим путям, если в этом проблема?

Я новичок в Докере. Я узнал об этом вчера, поэтому, если я не прояснил ситуацию или вам нужна дополнительная информация, пожалуйста, напишите мне в личку или оставьте комментарий.

1 Ответ

1 голос
/ 06 июля 2019

На самом деле, это не вопрос о докере, а вопрос о 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' в файле Release (неверная запись 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...