У меня есть приложение 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, работающий с моим изображением и / или как я могу добавить его к своим путям, если в этом проблема?
Я новичок в Докере. Я узнал об этом вчера, поэтому, если я не прояснил ситуацию или вам нужна дополнительная информация, пожалуйста, напишите мне в личку или оставьте комментарий.