У меня есть работа на Python, которую я пытаюсь отправить в образе Docker. Код структурирован таким образом, что некоторые модули импортируются из папки modules, поэтому я добавил путь к Python.
В частности, файл Dockerfile
FROM python:3
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
ENV PYTHONPATH "/usr/src/app"
RUN pip3 install -r requirements.txt
Как видите, я пытаюсь установить переменную среды для PYTHONPATH, чтобы он находил материалы в том же рабочем каталоге.
Скрипт для запуска называется main.py, и когда я запускаю его локально (не из докера) как
PYTHONPATH=$PYTHONPATH:$HOME/job-path python3 main.py
он работает нормально.
С этим Dockerfile instesd, после создания образа, который я получаю с docker inspect <ID>, поле Env содержит
"Env": [
"PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=C.UTF-8",
"PYTHON_VERSION=3.6.4",
"PYTHON_PIP_VERSION=9.0.1",
"PYTHONPATH=/usr/src/app"
]
так будет выглядеть нормально? Но docker run дает мне
ModuleNotFoundError: No module named 'modules'
@SagarRuchandani Готово, тоже не работает, результат тот же.
Не уверен, что происходит внутри контейнера. Может ли это быть дубликатом stackoverflow.com/questions/47355844/…
Вы понимаете, что, задав ENV в файле докеров, вы заменили его вместо добавления, верно? Советую сделать: ENV PYTHONPATH = "$PYTHONPATH:/usr/src/app" взамен
Вы в этом разобрались?
@SebastianFleck Вероятно, до этого не было ничего другого ...?






Проблема здесь в том, что, вероятно, у вас нет __init__.py в вашей папке src, которую вы копируете на /usr/src/app. Поэтому пакет modules не был распознан. Вы можете добавить __init__.py в свою папку src или добавить modules в PYTHONPATH
ENV PYTHONPATH "/usr/src/app/:/usr/src/app/modules/"
Обратите внимание, что если ваша папка modules имеет подпапки, она также должна содержать __init__.py.
Синтаксис
ENV variable1[=value1] variable2[=value2] ...
Без знака равенства вы создаете две пустые переменные; имя второго - /usr/src/app. Ты хочешь
ENV PYTHONPATH = "/usr/src/app"
со знаком равенства между именем переменной и ее значением.
Если вы хотите добавить к существующему значению, вы можете:
ENV PYTHONPATH = "/usr/src/app:${PYTHONPATH}"
Можете ли вы добавить команду запуска докера к
-e PYTHONPATH = "/usr/src/app"и попробовать запустить ее снова?