Работа на Гитопс Рамки вокруг Куберанес Я естественно запускаю все в контейнерах. Два докерафайла, которые большинству для меня, к сожалению, оба должны загружать много зависимостей, не включенных в хранилище, в течение времени сборки. Что означает, что кэш слоя имеет решающее значение. К сожалению, эфемерные CI/CD бегунов, как Действия GitHub, начните каждый прогон с пустым кешем.
Первый из двух DockerFiles создает изображение для сама рамок. Это изображение используется для начала загрузки, автоматизации, а также аварийное восстановление. Как таковой, это не твой Run-Mill Dockerfile Отказ Он включает в себя ряд зависимостей, установленных из пакетов Debian, различные двоичные файлы GO и, не в последнюю очередь, но не менее важно на основе клиса Python AWS, Azure и Google Cloud. Он занимает тяжелое использование многоступенчатых сборки и имеет различные этапы сборки для общих зависимостей, а также у каждого конкретных зависимостей каждого поставщика облака. Слои окончательного изображения также отражают логику сцены сборки.
Dockerfile Номер два для KUBESTACK сам сайт. Сайт построен с использованием GATSBY и должен загрузить много узлов модулей во время сборки. Dockerfile оптимизирован для кэша-способности и использует многоступенчатые сборки, чтобы иметь среду сборки на основе NODEJS и окончательное изображение на основе Nginx, чтобы служить статической сборке.
Создайте время для обоих, изображения Frameworke и Image веб-сайта, в значительной степени выгод от кэша слоя.
Docker имел возможность использовать изображение в качестве кеша сборки, используя --cache-от
Параметр в течение некоторого времени. Это был мой предпочтительный вариант, потому что мне нужна способность строить и толкать изображения в любом случае. Хранение кэша наряду с изображением не является моим моим мнением.
Для изображения веб-сайта Первый шаг моего CI/CD-конвейера — вытащить изображение кэша. Обратите внимание на правда
docker pull gcr.io/$PROJECT_ID/$REPO_NAME:latest-build-cache || true
Шаг второй запускает сборку на стадию Dev My Multi-Stepe DockerFile и тегирует результат в качестве нового кэша сборки.
docker build \ --cache-from gcr.io/$PROJECT_ID/$REPO_NAME:latest-build-cache \ --target dev \ -t gcr.io/$PROJECT_ID/$REPO_NAME:latest-build-cache \ .
Следующий шаг запускает фактическую сборку, которая производит окончательное изображение и тег.
docker build \ --cache-from gcr.io/$PROJECT_ID/$REPO_NAME:latest-build-cache \ -t gcr.io/$PROJECT_ID/$REPO_NAME:$COMMIT_SHA \ .
Наконец, трубопровод подталкивает оба изображения.
docker push gcr.io/$PROJECT_ID/$REPO_NAME:latest-build-cache docker push gcr.io/$PROJECT_ID/$REPO_NAME:$COMMIT_SHA
Для простых многоступенчатых сборки только с двумя этапами, таких как Dockerfile My GATSBY веб-сайта, это работает довольно хорошо.
Но когда я попробовал это для проекта с несколькими этапами сборки, один для Python и один для JS, указывая два изображения под --cache-от
никогда не работал надежно. Что является двойным несчастным, потому что наличие кеша слоя здесь сэкономит время, не загружая зависимости Python и JS на каждом запуске.
Шаги Cache Pull и Cache Case для каждого этапа также делают для разносостойного файла многослойного трубопровода, тем больше у вас есть этапы.
Так что для рамок DockerFile мне нужно что-то лучше.
Введите budject. Buildkit приносит ряд улучшений в строительство изображений контейнера. Тот, который выиграл меня:
- Беговые этапы сборки одновременно.
- Увеличение кэш-эффективности.
- Обработка секретов во время сборки.
Помимо общего повышения эффективности кэша, он также позволяет больше контролировать кеши при создании с Buildctl. Это то, что мне нужно. Buildkit имеет три варианта экспорта кеша. Позвонил встроенный, реестр и локальный. Местные не особенно интересны в моем случае, но позволило бы написать кэш в каталог. Встроенный включает в себя кэш в конечном итоге и нажимает кэш и изображение к слоям реестра вместе. Но это только входит в кеш для завершающей стадии в многоступенчатых сборках. Наконец, вариант реестра позволяет нажимать все кэшированные слои всех этапов в отдельное изображение. Это то, что мне нужно для моей рамки DockerFile.
Давайте посмотрим, как я использую это в моем трубопроводе. Наличие экспорта и импорта кеша, включенные в BuildKit, означает, что я могу уменьшить три шага в один. И это также остается на шаге, независимо от того, сколько этапов моего докерафила.
docker run \ --rm \ --privileged \ -v `pwd`/oci:/tmp/work \ -v $HOME/.docker:/root/.docker \ --entrypoint buildctl-daemonless.sh \ moby/buildkit:master \ build \ --frontend dockerfile.v0 \ --local context=/tmp/work \ --local dockerfile=/tmp/work \ --output type=image,name=kubestack/framework-dev:test-${{ github.sha }},push=true \ --export-cache type=registry,ref=kubestack/framework-dev:buildcache,push=true \ --import-cache type=registry,ref=kubestack/framework-dev:buildcache
Это одна команда обрабатывает потянув и импортирование кеша, создание изображения, экспортируя кеш и нажатие изображения и кэш. Запустив сборку внутри контейнера, мне также не нужно беспокоиться о установке демона Buildkit и CLI. Единственное, что мне нужно было сделать, было предоставлено .Docker/Config
В сборку внутри контейнера, чтобы иметь возможность нажать изображение и кеш в реестр.
Для рабочего примера взгляните на Kubestack Выпуск автоматизации трубопровода на Github.
Используя кэш, каркасное изображение строит менее чем за одну минуту. Вниз примерно за три минуты перед использованием Buildkit без экспорта и импорта кэша.
Оригинал: «https://dev.to/pst418/speed-up-multi-stage-docker-builds-in-ci-cd-with-buildkit-s-registry-cache-11gi»