Комментарии 5
Есть еще вариант. Самое долго в сборке питон-контейнера (да и рубей кстати тоже) является скачивание и установка пакетов. Если закешировать их локально (и пробросить папку с кешом в dind) — все станет гораздо веселее.
Собственно, и у NPM или NuGet абсолютна такая же история. Наиболее затратным является скачивание и утановка пакетов.
Недавно на работе проводил сравнение alpine vs slim. Получилось, что slim в 2 раза быстрее собирается, но весит в 1.5 раза больше. Возможно, можно его ещё уменьшить, но пока и это устроило.
К сожалению, я не пишу на питоне, и не увижу каких-то дополнительных подводных камней, но в своих Java и JS проектах я использую другой подход. Делюсь:
Вместо того, чтобы запускать с помощью CI сборку докером, а докером запускать сборку питоном, можно всё это дело "вынести вверх". Сделать свой образ для сборки, $CI_REGISTRY_IMAGE/tooling:latest, установить в него все нужные для сборки инструменты и docker cli (чтобы не запускать dind). Докерфайл для его сборки положить в корень в папку tooling и джобу запускать при only.changes в ней. Пушим в регистри.
Далее уже выполняем сборку приложения джобой, у которой image: $CI_REGISTRY_IMAGE/tooling:latest. Тут уже можно легко использовать кеширование зависимостей, например у меня и maven и gradle целиком сохраняют все свои пакеты между запусками. После выполнения основного скрипта собираем докером образ из полученных артефактов и пушим, куда надо.
Как сократить время сборки образов Docker в GitLab CI