Ошибка модуля PythonNotFound при запуске в контейнере докеров

Я пытаюсь контейнеризировать свою программу. Локально все работает нормально, но при сборке и запуске контейнера импорт работает не так, как хотелось бы.

Вот мой Dockerfile

FROM python:3.8

WORKDIR /src 

COPY requirements.txt ./

RUN pip install -r requirements.txt

COPY . .

CMD ["python3", "./app/run.py"]

Вот общая файловая структура, которую я создаю.

app
├── module
│   ├── file.py
│   └── __init__.py
├── __init__.py
└── run.py

run.py выглядит примерно так:

from app.module import Class

instance = Class(args)
instance.do_stuff

и мое приложение/модуль/init.py имеет:

from .file import Class

Опять же, это отлично работает, когда я запускаю его локально. Однако в конечном итоге я получаю ошибку импорта, когда запускаю это в докере.

Traceback (most recent call last):
  File "./app/run.py", line 3, in <module>
    from app.module import Class
ModuleNotFoundError: No module named 'app'

Я могу запустить свой код в контейнере, изменив импорт в run.py на from module import Class вместо from app.module import Class. Однако мне хотелось бы понять это лучше. Честно говоря, я бы предпочел, чтобы мой импорт был app.module, чтобы сделать локальный импорт более очевидным.

🤔 А знаете ли вы, что...
Python активно используется в научных и инженерных вычислениях.


180
1

Ответ:

Решено

Из https://docs.python.org/3/using/cmdline.html:

Если имя сценария напрямую относится к файлу Python, каталог, содержащий этот файл, добавляется в начало sys.path, и файл выполняется как основной модуль.

Каталог app добавлен в путь поиска. Если вы хотите, чтобы каталог, содержащий app, был добавлен в путь поиска, вы можете PYTHONPATH=$(pwd) или аналогичный.

Изучите PYTHONPATH и импортируйте документацию по Python. Рассмотрите возможность написания пакета Python для использования в вашем коде относительных выводов. https://docs.python.org/3/reference/import.html https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH