запуск торнадо-питона в докере: ModuleNotFoundError: нет модуля с именем '__main __. config';«__main__» не является пакетом - PullRequest
1 голос
/ 14 мая 2019

У меня есть приложение торнадо с файловой структурой, подобной этой:

projectfolder
|_ Dockerfile
|_ src
 |_ __init__.py
 |_ __main__.py
 |_ config.py

Мой dockerfile выглядит так:

FROM python:3.7
EXPOSE 8888

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["python3", "projectfolder/__main__.py"]

в __main__.py Я делаю from .config import Config

и при запуске Docker я получаю:

File "projectfolder/__main__.py", line 11, in <module>
  from .config import Config
ModuleNotFoundError: No module named '__main__.config'; '__main__' is not a package

Когда я запускаю проект внутри .venv, он работает нормально, но я не могу заставить его работать в докере

Есть идеи, как правильно импортировать файлы в текущей папке? Или как мне реструктурировать мои файлы в соответствии с рекомендациями Python

Спасибо!

1 Ответ

0 голосов
/ 15 мая 2019

1. Я полагаю, у вас есть опечатка для ENTRYPOINT ["python3", "projectfolder/__main__.py"], она должна быть ENTRYPOINT ["python3", "src/__main__.py"], в противном случае вы получите:

python3: невозможно открыть файл'projectfolder / main .py': [Errno 2] Нет такого файла или каталога

Я полагаю, вы допустили ошибку, когда задали минимальный вопрос, потому что COPY . . не будет копироватьprojectfolder вместо содержимого projectfolder.

2. Вернуться к вашей проблеме:

ModuleNotFoundError: Нет модуля с именем '__main __. Config';'__main__' не является пакетом

Здесь python find __name__ равен __main__, что означает, что скрипт, вызывающий from .config import Config, является скриптом верхнего уровня, а не пакетом.

И relative import можно использовать только в пакете, а не в пакете.Таким образом, вы можете просто изменить from .config import Config на from config import Config, удалить ., что означает, что относительный импорт может исправить вашу проблему.

...