Создание образов докеров с помощью Jib и Gitlab-CI

Я пытаюсь создать конвейер, в котором образы докеров создаются с использованием JIB (через плагин Maven) и помещаются в мой реестр Gitlab.

Это работает хорошо локально, как я вошел в мой реестр докера.

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
        <allowInsecureRegistries>true</allowInsecureRegistries>
        <from>
            <image>dockerhost/projectgroup/alpine</image>
        </from>
        <to>
            <image>dockerhost/project/imagename:${project.version}</image>
        </to>
        <container>
            <useCurrentTimestamp>true</useCurrentTimestamp>
        </container>
    </configuration>
</plugin>

Скажем, у меня есть.gitlab-ci.yml, который выглядит так:

stages:
  - build_image

build_image:
  stage: build_image
tags:
  - dev
script: |
  mvn compile jib:build

Теперь я получаю исключение, когда конвейер запущен

Build image failed: Failed to authenticate with registry dockerhost/projectgroup/alpine because: peer not authenticated

Я предполагаю, что получаю эту ошибку, потому что я не запустил docker login -u [имя пользователя] -p [пароль / токен]

Как же мне понадобится.gitlab-ci.yml, который использует образ docker-in-docker, чтобы иметь возможность запускать вход в Docker в моем скрипте?

Есть ли альтернатива использованию образа docker-in-docker для создания этого образа на моем Gitlab CI?

5 ответов

Начиная с GitLab 9.0 по умолчанию доступны все необходимые переменные:

  • CI_REGISTRY - URL реестра проекта
  • CI_REGISTRY_IMAGE - "базовое" имя образа реестра проекта
  • CI_REGISTRY_USER - технический пользователь, имеющий доступ к реестру проекта
  • CI_REGISTRY_PASSWORD - пароль / токен этого пользователя

Таким образом, вы можете создать и опубликовать образ с помощью этой команды:

       mvn compile jib:build \
    -Djib.to.auth.username=${CI_REGISTRY_USER} \
    -Djib.to.auth.password=${CI_REGISTRY_PASSWORD} \
    -Djib.to.image=${CI_REGISTRY_IMAGE}:latest

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

Используя GitLab, вы можете определить секретные переменные среды, которые вы можете использовать для передачи учетных данных реестра в Jib.

  1. Определите секретные переменные с помощью gitlab
  2. Передайте учетные данные реестра с помощью Jib

    mvn compile jib:build -Djib.to.image=my-container-image:latest -Djib.to.auth.username=$REGISTRY_USER -Djib.to.auth.password=$REGISTRY_PASSWORD
    

Для пользователей Gradle:

       ./gradlew jib \
 -Djib.to.image=${CI_REGISTRY_IMAGE}:latest \
 -Djib.to.auth.username=${CI_REGISTRY_USER} \
 -Djib.to.auth.password=${CI_REGISTRY_PASSWORD}

Вы можете настроить Jib с явным именем пользователя и паролями. Но обратите внимание, что Jib не отправляет пароли через незашифрованные соединения, если явно не настроен с-DsendCredentialsOverHttp.

https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin вызывает с помощью либо помощников по учетным данным, либо размещает кредиты непосредственно в настройках maven. Несмотря на то, что они называются "помощниками по учетным данным докера", я не думаю, что эти помощники по учету учетных данных на самом деле используют демон докера, скорее, они просто хранят кредиты с использованием соответствующего собственного хранилища и передают его в Jib, когда JIB должен аутентифицироваться, чтобы протолкнуть изображение. в Docker API-совместимый реестр.

https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin Различает сборку демона docker от сборки в реестр, поэтому я предполагаю, что если вы собираете в реестр, вам не нужен доступный демон, а это значит, что вам просто нужно изображение, способное запустить maven.

Конечно, именно этот неясный, непроверенный совет привел вас сюда, в первую очередь, прямо...

Другие вопросы по тегам