Рабочий процесс Docker с несколькими пакетами и общими источниками
Допустим, я хочу использовать Docker для приложения, которое состоит из двух частей. Эти части разные, но у них есть общие библиотеки.
Итак, у меня есть две папки:
part1/
Dockerfile
src/
part2/
Dockerfile
src/
Тем не менее, я хочу, чтобы они поделились некоторыми файлами (например, библиотеками), потому что СУХОЙ. К сожалению, нет хорошей структуры каталогов, которая позволила бы мне сделать это: файлы Docker не могут ссылаться на родительские папки, и я не могу поместить их оба в верхнюю папку, потому что мне не разрешено изменять название Dockerfile.
Некоторые из этих файлов требуются на этапе сборки, поэтому я не могу использовать опцию "bind mount a volume" docker run
- docker run
слишком поздно.
Я вижу эти варианты, и они мне не нравятся:
Я могу добавить папку с именем
shared/
и используйте хак, чтобы поместить его "в" обе папки моего приложения. Эти хаки включают в себя его монтирование (что раздражает, потребует от меня каждый раз делать это и необъяснимое для моих коллег, которых я пытаюсь продать Docker) или копирование перед сборкой (выполнимо, если я прячу здание в сборку -script, скопировать папку перед сборкой и удалить ее сразу после нее, однако она делает недействительным кеш сборки, даже если общая папка не изменена и подвержена ошибкам)Я могу разделить проект на 3 разных проекта и связать их вместе, используя git-sub-что-то. С этой конфигурацией очень сложно работать (или я не знаю, как это сделать).
Я предполагаю, что моя ситуация не так уж редка, особенно с девизом "разделить приложения на несколько контейнеров". Так что, вероятно, есть очень хорошие способы работать с этим. Есть какие-нибудь подсказки?
1 ответ
Я знаю, что уже немного поздно, но, обеспокоенный той же проблемой, я в конечном итоге написал свою собственную структуру для генерации s.
Он называется Sand, и вы можете найти его здесь.
Это позволяет вам обмениваться кодом между файлами, которые позже преобразуются вDockerfile
с
Учитывая следующую структуру каталогов:
my-monorepo/
│
├── tweet-service/
| ├── src/
| ├── ...
│ └── Sandfile
│
├── home-timeline/
| ├── src/
| ├── ...
│ └── Sandfile
│
└── Sandfile
Вы можете написать свойSandfile
вот так:
# ./my-monorepo/Sandfile
from sand import *
def MyService(name):
From("ubuntu", "20.04")
Run("apt-get install python3")
Copy(Src="src", Dst="/app")
Entrypoint(f"python3 /app/{name}.py")
Sand("tweet-service")
Sand("home-timeline")
# ./my-monorepo/tweet-service/Sandfile
from sand import *
MyService("tweet-service") # Defined in ../Sandfile
# ./my-monorepo/home-timeline/Sandfile
from sand import *
MyService("home-timeline") # Defined in ../Sandfile