Docker-образы в CI
Образы для запуска джоб
Чтобы использовать Docker-образ на раннерах, укажите корректный путь до него. Например:
Фрагмент .gitlab-ci.yml:
stages:
- test
test: # название job
image: acr.polygon.t-technologies.ru/spirit/cicd-images/ubuntu:latest # образ
stage: test
script:
...
Build
Как работают pull и push в нашем Container Registry
Чтобы авторизоваться в Container Registry, добавьте CI/CD-переменную (например, SPIRIT_DOCKER_SA_KEY) c ключом сервисного аккаунта Spirit. Пример для Kaniko:
-
Откройте файл
.gitlab-ci.yml. -
Пропишите поле
before-scriptпо примерам ниже.Пример авторизации и сборки образа для Kaniko:
...
build: # для примера
stage: build # для примера
image: acr.polygon.t-technologies.ru/spirit/cicd-images/base-kaniko:latest
variables:
IMAGE_REF: acr.polygon.t-technologies.ru/<my_tenant>/<my_docker_image> # образ, который будет собран и запушен в Container Registry
IMAGE_TAG: $CI_COMMIT_SHA # тег образа
before_script:
- dp auth service-acc --key-file $SPIRIT_DOCKER_SA_KEY # в CI/CD-переменной должен лежать ключ сервис-аккаунта
- dp auth configure-kaniko # настройка docker config для kaniko (токен действует 1 час)
script:
- executor --dockerfile Dockerfile # собираем образ
--destination "${IMAGE_REF}:${IMAGE_TAG}"
--log-timestamp --cache -v info
- echo "pushed to ${IMAGE_REF}:${IMAGE_TAG}"
...
Проверить, есть ли Docker-образ в репозитории
Вы не можете пушить Docker-образ, если он уже есть в репозитории. Теги (кроме «latest», «stable») иммутабельны, поэтому у вас упадёт pipeline.
Используйте команду, чтобы проверить, есть ли образ в репозитории:
dp docker search --tenant=<tenant> --image=<image name> --tag=<tag name>
## Примеры:
# код завершения 0 - образ есть
dp docker search --tenant devplatform --image=container-registry --tag=latest
{...}
# код завершения 3 - образа нет
dp docker search --tenant devplatform --image=container-registry --tag=unknown
Not found
Пример использования в CI:
build:
stage: build
before_script:
- dp auth service-acc --key-file $DEVPLATFORM_DOCKER_SA_KEY
- dp auth configure-kaniko
- |
exit_code=0
dp docker search \
--tenant="$CI_PROJECT_NAMESPACE" \
--image="$SERVICE_NAME" \
--tag="$IMAGE_TAG" || exit_code=$?
if [ $exit_code -eq 0 ]; then echo "Image ${IMAGE_REF}:${IMAGE_TAG} already exists" && exit 0; fi
if [ $exit_code -ne 3 ]; then echo "Unexpected exit code for dp docker search $exit_code" && exit 1; fi