Кэширование кажется более сложным, чем я думал, и в документации докера для различных опций извлечения не упоминаются какие-либо нюансы.
Если образ докера может существовать, а может и не существовать, вы можете настроить команду docker pull так, чтобы она передавала сборку даже в случае сбоя извлечения:
- docker image pull $LATEST || true
Это вытянет изображение $ LATEST, если оно существует, в противном случае будет продолжено ваше построение. Следующий шаг - убедиться, что ваша сборка действительно может использовать его.
Опция --pull
для сборки докера выглядела как то, что вы хотели, и документация докера гласит
- тянуть Всегда пытаться тянуть более новую версию изображения
но похоже, что он на самом деле ничего не делает для реального изображения, которое вы создаете. Более многообещающим является --cache-from
, который позволяет вам называть изображения, из которых может кэшироваться Docker. В моем простом тесте я не видел, чтобы докер действительно использовал мой кэш, возможно потому, что в образе докера недостаточно слоев для его использования.
- docker image pull $LATEST_IMAGE || true
- docker build --pull -t $TAGGED_IMAGE --cache-from $LATEST_IMAGE .
- docker tag $TAGGED_IMAGE $LATEST_IMAGE
- docker push $LATEST_IMAGE
- docker push $TAGGED_IMAGE
Это может быть более полезно, если ваш образ сборки многоступенчатый сборка, и может реально использовать кеш. При желании вы можете настроить скрипт gitlab-ci, чтобы избежать сборки, если изображение существует.
По желанию, вы можете захотеть взглянуть на конвейеры gitlab-ci и создать дополнительные этапы и триггеры для случаев, когда вы создаете и продвигаете общие, и когда вы создаете свои подпроекты.
Я определяю переменные в секции variables
в начале файла
Последний определяется тегом :latest
, который в основном является самой последней сборкой из любой ветви CI для проекта. $TAGGED_IMAGE
определяется с помощью :$CI_COMMIT_SHORT_SHA
, который помечает образ докера с помощью git SHA, что упрощает отслеживание развертываний kubernetes в среде разработки.