Это довольно конкретный вопрос, поэтому я открыт для полезных предложений, которые помогут ему.
У меня есть проект python, который запускается внутри контейнера докеров, настроенного для работы с отладчиком Pycharm. У меня есть пакет, установленный в виртуальном окружении с помощью pip, используемый в этом проекте, который я хотел бы разработать.
Я не нашел способа связать пакет с контейнером докеров моего проекта таким образом, чтобы я мог изменить пакет и обновить код в моем проекте. В настоящее время отладчик работает с путями кода, которые входят в пакет, если я не меняю код в пакете.
Сочетание этих двух проблем затрудняет тестирование изменений в пакете, не устанавливая его снова и снова.
Есть ли лучший способ достичь этой цели?
У меня еще нет полного ответа на этот вопрос, но самое близкое, что я получил, - это загрузка моего пакета как тома с указанием пути назначения, в котором пакеты pip в конечном итоге устанавливаются в контейнере докера. Использование pip install -e как части моей сборки образа не сработало для меня, потому что я считаю, что под капотом -e используются символические ссылки, которые не работают должным образом в контейнерах докеров. Вышеупомянутый метод позволяет выполнять горячую перезагрузку изменений пакета, хотя использование отладчика в пакете по-прежнему довольно удачно.
Установите пакет в редактируемом режиме.
pip install -e .
Это позволит вам одновременно вносить изменения в код и обновлять пакет.
Вы можете попробовать использовать комбинацию того, что предлагает @pbskumar и тома докеров.
Сначала запустите свой контейнер с опцией --volume /path/to/your/package/on/host/:/path/in/your/container
А затем вы выполняете это внутри контейнера:
pip install -e /path/in/your/container
Он должен работать.
Учитывая два исходных дерева, которые должны работать вместе:
python -m venv vpy
.. vpy/bin/activate
.cd library && pip install -e .
(-e
заставляет pip запоминать указатель на дерево исходных текстов в реальном времени.)cd app && pip install -e .
. (Пип должен знать, что у вас уже установлена библиотека.)$EDITOR file.py; pytest; the_app; $SCM commit
.docker build && docker run
.Я бы оставил любое взаимодействие с Docker до самого конца, как только вы убедитесь, что исправили ошибку библиотеки или создали функцию. Это позволяет избежать проблем с вашим редактором и контейнером, не согласующимися с путями, и это означает, что вам не нужны привилегии root для любой вашей обычной работы по разработке.
Думаю, я рассмотрел все изложенные выше основы с помощью этой системы:
Моя структура проекта:
projects
projectA (my docker project)
projectB (the library used in my docker project that I want to develop on)
В projectA: настройки проекта -> интерпретатор проекта -> добавить сопоставления путей -> сопоставить путь локальной библиотеки с путем удаленной установки в контейнере
бывший. локальный путь: / user / {имя пользователя} / projects / projectB удаленный путь: /usr/local/lib/python3.6/site-packages/projectB
В projectA: настройки проекта -> структура проекта -> добавить корень содержимого (projectB) -> выбрать отметку как источники
В projectA: отметьте путь к projectB в контейнере как том в dockerfile
бывший. ТОМ /usr/local/lib/python3.6/site-packages/projectB
В projectA: загрузить локальную библиотеку как том в установку библиотеки в контейнере в docker-compose.yml
бывший.
объемы:
- ../projectB:/usr/local/lib/python3.6/site-packages/projectB
Использование python 3.6 и Pycharm 2018.2
Я оговорился, я больше не использую virtualenv, поскольку зависимости установлены в моем контейнере докеров. Использование
pip install -e
работало до переноса проекта в Docker, но я не могу найти способ заставить его работать сейчас.