Использование локальной зависимости в режиме разработки в проекте, смонтированном в контейнере docker

#docker #python-poetry

#docker #python-поэзия

Вопрос:

Я столкнулся с проблемой, с которой мне нужна помощь.

Мы работаем над проектом, который является докеризированным и выполняется в стеке docker-compose. Наш код смонтирован в контейнере, чтобы обеспечить возможность перезагрузки изменений в реальном времени. Но в этом проекте используется собственная библиотека, которая может потребовать изменений. Цель состояла бы в том, чтобы эта библиотека также была смонтирована в контейнере, поскольку в настоящее время единственный способ — установить ее poetry add ../ArcheologCommon и запустить все локально (без docker). Это настоящая проблема, поскольку у нас есть много конфигураций и более 7 сервисов для запуска

Первым решением, которое я нашел, было смонтировать мой локальный venv в контейнер, но это не работает по нескольким причинам:

  • Монтирование всего venv приводит к жестко заданным абсолютным путям в env/bin/activate папке, которые могут использоваться только хостом.
  • Монтируйте только venv/lib папку, чтобы избежать этой проблемы с жестко заданным путем.

Это работает очень хорошо, пока я не запустил poetry add ../ArcheologCommon , что дает мне ModuleNotFoundError: No module named 'archeolog_common' исключение в моем контейнере.

Оглядываясь на то, что poetry сделала в моем venv, я обнаружил, что моя библиотека стала *.egg-link файлом, содержащим абсолютный путь к моей библиотеке на моем ноутбуке

 ~/ ➤ docker exec -ti backend bash
www-data@467190e2f634:~/backend$ cat .venv/lib/python3.8/site-packages/archeolog-common.egg-link 
/home/path/to/ArcheologCommon
 

Единственное решение, которое я нашел, — это смонтировать мою локальную копию кода непосредственно в пакеты сайта venv вместо уже присутствующего там кода:

 services:
  backend:
     command: server.py --bind 0.0.0.0 --port 9000 --reload-dir /var/www/backend --reload-dir /opt/venv/lib/python3.8/site-packages/archeolog_common
    #  [ ...]
     volumes:
       - ...
       - ../../ArcheologCommon/archeolog_common:/opt/venv/lib/python3.8/site-packages/archeolog_common:ro
 

В результате изменения обнаруживаются правильно и работают нормально.

 WARNING:  StatReload detected file change in '/opt/venv/lib/python3.8/site-packages/archeolog_common/models/graph.py'. Reloading...
INFO:     Shutting down
INFO:     Finished server process [156]
INFO:     Started server process [191]
 

Я думаю, что это ужасное решение (которое работает, поэтому я все еще отдаю ему должное), но мне интересно, есть ли какие-нибудь лучшие решения?

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

Спасибо, что прочитали меня!

Комментарии:

1. решает ли проблему создание образа docker с исходными текстами python в виртуальной среде и зависимостями, включая стороннюю библиотеку?