Ошибка 'rest_framework_nested.routers' только в Docker

Я пытаюсь развернуть приложение Django через docker, но столкнулся с этой проблемой. Когда я запускаю приложение локально, у меня нет проблем, но когда я разворачиваю его в Docker, я получаю такую ошибку:

AttributeError: module 'rest_framework_nested.routers' has no attribute 'NestedDefaultRouter'

Последние строки трассировки стека выглядят следующим образом:

  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/= /app/store/urls.py", line 13, in <module>
    modules_router = routers.NestedDefaultRouter(router, 'modules', lookup='module')
AttributeError: module 'rest_framework_nested.routers' has no attribute 'NestedDefaultRouter'

Файл, из которого исходит ошибка, выглядит следующим образом:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from rest_framework_nested import routers
from . import views

router = DefaultRouter()
router.register('modules', views.ModuleViewSet, basename='modules')

modules_router = routers.NestedDefaultRouter(router, 'modules', lookup='module')

Мой Dockerfile выглядит следующим образом:

FROM python:3.9.9-slim

#Set up user
RUN apt-get update
RUN apt-get -y install sudo
RUN addgroup app && adduser -system app -ingroup app
USER app
WORKDIR = /app

#Environment settings`
ENV PYTHONUNBUFFERED=1

#Install MySQL and dependencies
RUN sudo apt-get -y install python3.9-dev
RUN sudo apt-get -y install default-libmysqlclient-dev
RUN sudo apt-get -y install build-essential libssl-dev libffi-dev
RUN sudo apt-get -y install libxml2-dev libxslt1-dev zlib1g-dev
RUN pip install mysqlclient
RUN sudo apt-get -y install default-mysql-server
RUN sudo apt-get -y install gunicorn3

#Copy files and install other dependencies
COPY . .
RUN pip3 install -r requirements.txt

Я несколько часов безуспешно рылся в Интернете. Похоже, это какая-то аномалия, если только я не упустил что-то очень очевидное.

Запуск той же кодовой базы, того же файла настроек и т.д. локально проходит без проблем. И, да, drf-nested-routers==0.93.4 находится в файле требований. Когда я запускаю pip3 install drf-nested-routers в среде docker, я получаю, что требование уже выполнено.

Итак, мне удалось отследить эту проблему.

NestedDefaultRouter - это метод в rest_framework_nested, который поставляется вместе с установкой пакета drf-nested-routers. По какой-то причине у меня также был установлен пакет django-rest-framework-nested. Похоже, что проблема была в этом. После удаления django-rest-framework-nested образ запускается без проблем.

Тот факт, что он работал локально, а не в Docker, вероятно, связан с порядком установки. В любом случае, теперь все исправлено.

Вернуться на верх