Рабочий процесс Docker с несколькими пакетами и общими источниками

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

Итак, у меня есть две папки:

part1/
    Dockerfile
    src/
part2/
    Dockerfile
    src/

Тем не менее, я хочу, чтобы они поделились некоторыми файлами (например, библиотеками), потому что СУХОЙ. К сожалению, нет хорошей структуры каталогов, которая позволила бы мне сделать это: файлы Docker не могут ссылаться на родительские папки, и я не могу поместить их оба в верхнюю папку, потому что мне не разрешено изменять название Dockerfile.

Некоторые из этих файлов требуются на этапе сборки, поэтому я не могу использовать опцию "bind mount a volume" docker run - docker run слишком поздно.

Я вижу эти варианты, и они мне не нравятся:

  1. Я могу добавить папку с именем shared/и используйте хак, чтобы поместить его "в" обе папки моего приложения. Эти хаки включают в себя его монтирование (что раздражает, потребует от меня каждый раз делать это и необъяснимое для моих коллег, которых я пытаюсь продать Docker) или копирование перед сборкой (выполнимо, если я прячу здание в сборку -script, скопировать папку перед сборкой и удалить ее сразу после нее, однако она делает недействительным кеш сборки, даже если общая папка не изменена и подвержена ошибкам)

  2. Я могу разделить проект на 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
Другие вопросы по тегам