Создание образов докеров с помощью 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.
- Определите секретные переменные с помощью gitlab
Передайте учетные данные реестра с помощью 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.
Конечно, именно этот неясный, непроверенный совет привел вас сюда, в первую очередь, прямо...