Использование частного образа Docker из реестра Gitlab в качестве базового образа для CI

Как мне пройти аутентификацию, если я хочу использовать образ из реестра Gitlab в качестве базового образа другой сборки CI?

Согласно https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#using-a-private-docker-registry Сначала мне нужно вручную войти в систему с раннером. Как-то странно входить в систему с существующим пользователем Gitlab.

Есть ли способ использовать переменную CI «CI_BUILD_TOKEN» (которая описывается как «Токен, используемый для аутентификации с помощью реестра контейнеров GitLab») для аутентификации, чтобы получить базовый образ из реестра Gitlab?

РЕДАКТИРОВАТЬ: Я узнал, что могу использовать изображения из публичных проектов. Но я не очень хочу делать свои докерные проекты общедоступными.

ОБНОВЛЕНИЕ: начиная с Gitlab 8.14 вы можете просто использовать образы докеров из сборки в реестре докеров. См. https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#support-for-gitlab-integrated-registry < / а>


person Martin Sadowski    schedule 08.07.2016    source источник


Ответы (4)


Нет, в настоящее время это невозможно каким-либо элегантным способом. GitLab должен реализовать явные учетные данные для базовых изображений, это будет наиболее простое и правильное решение.

Вам нужно docker login на машине GitLab Runner. Вы не можете использовать gitlab-ci-token, поскольку срок их действия истекает, а также зависит от проекта, поэтому вы не можете использовать один токен для каждого проекта. Использование вашего собственного логина - практически единственное решение, доступное прямо сейчас (рад, что мы исправили это).

person Nikolai Prokoschenko    schedule 08.07.2016
comment
Спасибо. Ты прав. Сейчас это невозможно. Указатели, которые я нашел: gitlab.com/gitlab-org/gitlab-ce/issues/ 19219 и gitlab.com/gitlab-org/gitlab-ce/ issues / 19275 - person Martin Sadowski; 10.07.2016
comment
В продолжение этого есть пара билетов gitlab, связанных с более элегантным раскрытием этой функциональности (gitlab.com/gitlab-org/gitlab-ce/issues/19275). Однако сейчас это, похоже, находится в очереди. Будем надеяться, что при большей поддержке эта возможность станет чем-то, что команда считает столь же важной, как кажется сообществу пользователей. - person user376327; 08.09.2016

Теперь возможно, они включили эту опцию несколько месяцев назад.

Используйте пользователя gitlab-ci-tokenas и переменную $CI_BUILD_TOKEN в качестве пароля.

Этот пример работает на GitLab 8.13.6. При необходимости он создает тестовое изображение и на следующем этапе использует его для проверки синтаксиса:

build_test:
  stage: build_test_image
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:test -f dockerfiles/test/Dockerfile .
    - docker push $CI_REGISTRY_IMAGE:test
  tags:
    - docker_build
  environment: test

test_syntax:
  image: $CI_REGISTRY_IMAGE:test
  stage: test
  script:
    - flake8 --ignore=E501,E265,E402 .

ОБНОВЛЕНИЕ: перечитав вопрос, принятый ответ правильный. В моем примере задание test_syntax не сможет пройти аутентификацию в реестре, если пользователь не войдет в систему вручную с машины-исполнителя. Хотя это может сработать, если 2 участника находятся на одном хосте, но в любом случае это не лучшее решение.

В gitlab-ci-multi-runner 1.8 есть возможность добавить Учетные данные реестра как переменная, поэтому вам нужно войти в систему только один раз, чтобы получить закодированные учетные данные. См. документация.

person charli    schedule 14.12.2016
comment
Какой тип бегуна вы используете для этого? Если вы используете оболочку runner, GitLab CI не извлекает образ из реестра, а вместо этого использует образ, который вы только что создали на хосте на предыдущем этапе. - person BrokenBinary; 20.12.2016
comment
На самом деле я использую 2 бегунов. Один с исполнителем оболочки, другой с исполнителем докера. Предполагаемое использование исполнителя оболочки - только для создания образов Docker, поэтому я использую тег docker_build. Также обратите внимание на директиву image внутри задания test_syntax и ее отсутствие в build_test. - person charli; 21.12.2016

Это абсолютно возможно с сентября 2018 года. Я выложу здесь свою наивную реализацию.

Контекст:

  • Вам нужно будет использовать службу docker:dind, которая позволяет запускать команду docker внутри контейнера докеров.
  • Для этого потребуется использовать действительный docker login, что можно сделать с помощью встроенных переменных GitLab (gitlab-ci-token, $CI-JOB-TOKEN).
  • Затем вы должны иметь возможность аутентифицироваться в реестре репо (пример $REGISTRY значение: registry.gitlab.com/$USER/$REPO:$TAG), что позволит вам выталкивать или извлекать контейнеры докеров из контекста CI / CD, а также с любого аутентифицированного сервера докеров.

Реализация:

Создайте этот блок на верхнем уровне, чтобы обеспечить его выполнение перед следующими заданиями:

before_script: 
        - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $REGISTRY

Задание по созданию и сохранению изображений в вашем реестре:

build_container:
    image: docker:latest
    stage: build
    services:
        - docker:dind
    script:
        - docker build -t $REGISTRY .
        - docker push $REGISTRY

Задание, использующее настраиваемое изображение:

build_app:
    image: $REGISTRY
    stage: deploy
    script:
        - npm run build

В отношении вакансий кросс-репо:

Я добиваюсь этого, создавая пользователя GitLab "бота" и назначая ему доступ к репозиториям / группам по мере необходимости. Затем нужно просто заменить gitlab-ci-token и $CI_JOB_TOKEN соответствующими переменными среды. Это необходимо только в том случае, если базовое изображение является частным.

person Chris Vincent    schedule 04.09.2018
comment
before_script не запускается перед заданием. Он просто объединяется с элементом скрипта и запускается в контексте изображения, указанного в задании. Учитывая это, похоже, это не сработает? - person Michael Macnair; 23.02.2021
comment
Обычно я использую before_script в расширенном задании, чтобы его можно было использовать для нескольких других заданий докеров (по одному для отправки в gitlab / dockerhub / и т. Д., В зависимости от тега / ветки). Он предназначен для запуска в контексте образа и использования службы dind, так как образ должен иметь доступ к командам докеров для работы любого из login, build, push. Пока на первом месте идет login, все работает, как задумано. Я использую эту стратегию для нескольких производственных приложений; если у вас возникла конкретная проблема, я могу попытаться вам помочь. - person Chris Vincent; 01.03.2021

Возможно, вам сначала нужно войти в реестр контейнеров gitlab для изображения, которое вы хотите использовать, см. Пример ниже. Обратите внимание на before_script:, который в основном аутентифицирует вас перед использованием изображения.

image: docker:latest
services:
  - docker:dind

stages:
  - build

variables:
  CONTAINER_RELEASE_IMAGE: registry.gitlab.com/obonyojimmy/node-mono-clr:latest

before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_BUILD_TOKEN registry.gitlab.com

build-app:
  stage: build
  image: $CONTAINER_RELEASE_IMAGE
  script:
    - npm run build
person Jimmy Obonyo Abor    schedule 21.12.2016
comment
docker выдаст ошибку, если вы не добавите $: $ CONTAINER_RELEASE_IMAGE - person Eddy Ekofo; 18.08.2019