🐳 GitLab CI: Как создавать образы Docker в Kubernetes

kaniko

by itisgood

Один из наиболее распространенных вариантов использования – это создание образа Docker с помощью Gitlab.

Использование docker-су для создания контейнера – хорошее решение, но в некоторых случаях может быть небезопасным.

Имея привилегии на использование команды docker, вы можете создать или удалить любой контейнер.

С отказом от dockershim в kubernetes эта опция больше не используется.

Для этого можно использовать несколько инструментов, но в данном случае я буду использовать Kaniko.

Что такое Kaniko?

kaniko создает образы контейнеров из Dockerfile внутри контейнера или кластера Kubernetes.

Он не зависит от демона Docker и выполняет каждую команду Dockerfile полностью в пространстве пользователя.

Это позволяет создавать образы контейнеров в средах, в которых невозможно легко или безопасно запустить демон Docker – например, в стандартных кластерах Kubernetes.

Сборка образов с помощью Kaniko

Чтобы собрать Docker-образы с помощью Kaniko в Kubernetes Gitlab runner, достаточно просто использовать его образ в качестве образа для задания сборки:

stages:
- build
- deploy_to_kubernetes

variables:
  CACHE_TTL: 2190h0m0s # three months
  IMAGE_NAME: app

before_script:
  - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json

build-backend:
  stage: build
  tags:
    - kubernetes
  image:
    name: gcr.io/kaniko-project/executor:v1.9.0-debug
    entrypoint: [""]
  script:
    - /kaniko/executor \
      --context "${CI_PROJECT_DIR}" \
      --dockerfile "${CI_PROJECT_DIR}/Dockerfile" \
      --destination "${CI_REGISTRY_IMAGE}/${IMAGE_NAME}:${CI_COMMIT_TAG}" \
      --cache-repo ${CONTAINER_REGISTRY}/${IMAGE_NAME} \
      --cache=true \
      --cache-ttl $CACHE_TTL

GitLab предоставляет функциональность для кэширования часто используемых образов.

Это поможет вам не превышать лимиты скорости Docker Hub.

Это также повысит производительность ваших сборок.

Чтобы включить Dependency Proxy, перейдите в родительскую группу вашего проекта Settings > Packages & Registries > Dependency Proxy

variables:
  CACHE_TTL: 2190h0m0s # three months
  IMAGE_NAME: app

before_script:
  - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json

build-backend:
  stage: build
  tags:
    - kubernetes
  image:
    name: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/executor:v1.9.0-debug
    entrypoint: [""]
  script:
    - /kaniko/executor \
      --context "${CI_PROJECT_DIR}" \
      --dockerfile "${CI_PROJECT_DIR}/Dockerfile" \
      --destination "${CI_REGISTRY_IMAGE}/${IMAGE_NAME}:${CI_COMMIT_TAG}" \
      --registry-mirror "$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX" \
      --cache-repo ${CONTAINER_REGISTRY}/${IMAGE_NAME} \
      --cache=true \
      --cache-ttl $CACHE_TTL

см. также:

 

You may also like

Leave a Comment