У меня есть монолитное репо, которое содержит все мои проекты. Текущая настройка, которую я имею, состоит в том, чтобы вызвать сборочный контейнер, смонтировать мое монолитное хранилище и построить мои проекты последовательно. Скопируйте двоичные файлы и создайте их соответствующие контейнеры среды выполнения (производства) последовательно.
Я считаю этот процесс довольно медленным и хочу улучшить скорость. Два основных подхода Я хочу принять это
В сборочном контейнере компилируйте двоичные файлы моего проекта одновременно. Вместо последовательно.
Как и в шаге 1, также создайте мои контейнеры времени выполнения (производства) одновременно.
Я провел небольшое исследование, и мне кажется, что меня интересуют две функции Docker :
Многоступенчатое здание . Что позволяет мне не беспокоиться о сборочном контейнере и складывать все в один Dockerfiles
.
--parallel
опция для docker-compose
, которая решает подход # 2, позволяя мне одновременно создавать свои контейнеры времени выполнения.
Тем не менее, есть еще две проблемы :
Как мне склеить две функции вместе?
Как мне собрать свои двоичные файлы одновременно в сборочном Docker? Другими словами, как я могу достичь подхода # 1?
Разъяснения
Независимо от того, используется многоступенчатый или нет, есть две логические фазы.
Во-первых, это фаза бинарного построения. На этом этапе артефакты представляют собой скомпилированные исполняемые файлы (двоичные файлы) из контейнеров сборки. Поскольку я не использую многоэтапную сборку, я копирую эти двоичные файлы на хост, поэтому хост служит промежуточной промежуточной областью. В настоящее время двоичные файлы собираются последовательно, я хочу построить их одновременно в контейнере сборки. Отсюда подход # 1.
Второй этап создания изображения. На этом этапе двоичные файлы предыдущего этапа, которые теперь хранятся на хосте, используются для создания моих рабочих образов. Я также хочу построить эти образы одновременно, поэтому подхода # 2.
Multi-stage позволяет мне исключить необходимость промежуточной промежуточной области (хост). И --parallel
позволяет мне создавать производственные образы одновременно.
Что меня интересует, так это то, как я могу достичь подхода # 1 & # 2 с использованием многоступенчатого и --parallel
. Потому что для каждого проекта я могу определить отдельную многоступенчатую Dockerfiles
и вызвать --parallel
для всех них, чтобы их изображения были построены отдельно. Это позволило бы достичь подхода # 2, но это породило бы отдельный контейнер сборки для каждого проекта и потребовало бы много ресурсов (я использую один и тот же контейнер сборки для всех моих проектов, и это 6 ГБ). С другой стороны, я могу написать скрипт для одновременной сборки двоичных файлов моего проекта в контейнере сборки. Это позволит достичь подхода # 1, но тогда я не смогу использовать многоэтапный режим, если я хочу одновременно создавать производственные образы.
Что мне действительно нужно, так это Dockerfiles
вот так:
FROM alpine:latest AS builder
RUN concurrent_build.sh binary_a binary_b
FROM builder AS prod_img_a
COPY binary_a .
FROM builder AS prod_img_b
COPY binary_b .
И вы сможете запускать команду docker-compose
вот так (я это выдумал):
docker-compose --parallel prod_img_a prod_img_b
Дополнительные уточнения
исполняемые двоичные файлы и исполняемые контейнеры не являются отдельными вещами. Я просто хочу иметь возможность параллельно создавать двоичные файлы и производственные образы.
--parallel
не использует разные хосты, но мой сборочный контейнер огромен. Если я использую многоступенчатую сборку и параллельно запускаю что-то вроде 15 из этих контейнеров сборки на моей локальной машине разработчика, это может быть плохо.
Я тоже думаю о раздельной компиляции бинарных и исполняемых контейнеров, но я не нахожу простой способ сделать это. Я никогда не использовал docker commit
, принесет ли в жертву кеш докера?