При создании сервера nodejs я заметил, что несколько вещей «легче сделать на python». Итак, я только что создал сценарий Python для указанных процессов.
Эти процессы порождаются nodejs через:
const { spawn } = require('child_process');
const args = [
'BackgroundServer/main.py',
_worker.poller_db.id,
'--log-file=~/var/www/log/background.log'
];
if (maxRuns !== undefined) {
args.push(`--max-num=${maxRuns}`);
}
const pythonProcess = spawn('BackgroundServer/venv/bin/python', args);
Это отлично работает в моей системе разработки; процесс python запускается, работает и работает аккуратно.
Однако переход на докер представляет собой серьезную проблему, очевидно, что venv добавлен в .dockerignore (как и в .gitignore).
Решение состоит в том, чтобы «построить» виртуальную среду на месте. Я пробовал это сделать, Dockerfile:
FROM node:carbon
WORKDIR ~/dockerapp
COPY package*.json ./
RUN npm install && \
virtualenv -p python3 BackgroundServer/venv && \
source BackgroundServer/venv/bin/activate && \
pip install -r BackgroundServer/requirements.txt
COPY . .
EXPOSE 1337
CMD [ "npm", "start" ]
Однако это не удается для команды "virtualenv" not found. - как мне сделать virtualenv доступным для "временного" бегуна?
Другое решение - создать виртуальную среду перед сборкой докера, а затем нет, игнорируя виртуальную среду, удается «запустить». Однако он терпит неудачу, заявляя, что не может найти несколько основных пакетов python, которые не могут запустить python с:
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
Итак .. как объединить оба, как создать контейнер nodejs, который "видит" домашнюю установку python и путь к python.






В вашем Dockerfile вы извлекаете из определенного базового образа:
FROM node:carbon
Система будет содержать только компоненты, которые уже находятся внутри образа node:carbon. Если вы хотите добавить некоторые дополнительные ресурсы (например, virtualenv), вы можете установить их в свой Dockerfile, используя стандартные команды, которые вы использовали бы в обычной системе.
Поскольку вы используете определенный образ узла для создания своего образа, вам могут не хватать некоторых основных зависимостей - их также необходимо установить в вашем контейнере докеров.