Как организовать общие библиотеки с docker и monorepo - PullRequest
2 голосов
/ 25 февраля 2020

Что у меня есть

У меня есть 2 python приложения, которые совместно используют несколько кусков кода, этого достаточно, чтобы я пытался выделить общие части в модули / пакеты / библиотеки (я придерживаюсь этого термина намеренно расплывчато, так как я не уверен, что решение). Весь мой код написан в монорепо, потому что я надеюсь преодолеть некоторые неудобства, связанные с управлением большим количеством репозиториев, чем у нас есть члены команды.

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

+ myproject
  + appA
  | + python backend A
  | + js frontend
  + appB
  | + B stuff
  + libs
    + lib1
    + lib2

И appA, и appB используют lib1 и lib2 (они по сути являются моделями данных для абстрагирования общей базы данных). appA - это веб-приложение с несколькими компонентами, не все из которых python. Он развернут как стек docker, который включает в себя несколько контейнеров. Я управляю своими зависимостями с помощью Стихи для обеспечения воспроизводимых сборок и т. Д. c ... Каждый компонент python (appA, appB ...) имеет собственный файл pyproject.toml, виртуальный env, et c ...

appB развертывается отдельно.

Вся разработка ведется на linux, если это имеет значение.

Что я need

Я ищу простой способ справиться с библиотеками:

  • Разработка для appA выполняется в локальной docker-compose установке. Бэкэнд автоматически перезагружается при изменениях файлов (с использованием тома docker), и я хотел бы, чтобы это происходило и с изменениями в библиотеках.
  • Разработка для appB проще, но переходит на docker так что проблема будет та же.

То, что я пробовал

  • Моим первоначальным "решением" было скопировать папку libs во временную папку для развитие в appA. Это работает для импорта, но это грязно, как только я хочу изменить код libs (который все еще довольно часто), так как мне нужно изменить исходный файл, скопировать, перестроить контейнер.
  • Я пытался символическая ссылка libs в среду docker бэкэнда, но символические ссылки, похоже, не работают с docker (похоже, он не следовал по ссылке, поэтому файлы не попадают в образ docker, если только По сути, я копирую файлы внутри контекста сборки docker, что противоречит цели ссылки.)
  • Я попытался упаковать каждую библиотеку в пакет python и установить их через poetry add ../../libs/lib1, что не на самом деле не работает внутри docker, потому что пути не совпадают, и тогда я возвращаюсь к проблеме символической ссылки.

Я уверен, что есть чистый способ сделать это, но я не могу понять это. Я знаю, что могу разбить репо на более мелкие и установить зависимости, но разработка все равно будет вызывать проблемы внутри docker, так как мне все равно придется перестраивать контейнер каждый раз, когда я изменяю lib-файлы, поэтому я бы предпочел оставить монорепо .

1 Ответ

0 голосов
/ 26 февраля 2020

Если вы используете docker -compose в любом случае, вы можете использовать тома для монтирования локальных библиотек в вашем контейнере и иметь возможность редактировать их в вашей хост-системе и контейнере. Не супер, но это должно сработать, верно?

@ ckaserer, похоже, ваше предложение действительно работает. Короче говоря, в файлах docker я делаю COPY ../libs/lib1 / app / lib1, а затем для локальной разработки я монтирую ../libs/lib1 в / app / lib1. Это дает мне поведение, которое я искал. Для этого я использую составной файл docker. Установка вызывает несколько проблем с различными инструментами, нуждающимися в дополнительной настройке, чтобы они знали, что библиотеки являются частью базы кода, но нет ничего невозможного. Спасибо за идею!

Так что, хотя это не идеальное решение, локальное монтирование поверх приложений и каталогов lib работает на Linux системах.

FYI : На хостах Windows вы можете столкнуться с проблемами, если хотите следить за изменениями файлов, так как они не передаются с хоста windows в контейнер Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...