使用Jib和Gitlab-CI构建Docker镜像

3
我正在尝试创建一个流水线,使用 JIB(通过 Maven 插件)创建 Docker 镜像并将其推送到我的 Gitlab Registry。
在本地登录到 Docker 注册表后,这个过程可以正常工作。
<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 login?

有没有其他方法可以在我的Gitlab CI上构建此镜像,而不使用docker-in-docker镜像?


(1)你不需要使用Docker来运行Jib。然而,我会假设你尝试从/推送到的dockerhost实际上是一个Docker引擎(本地或远程)。 (2)“peer not authenticated”是一个SSL证书验证问题。 - Chanseok Oh
5个回答

9
自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设置

2
< p >对于Gradle用户:

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

2
使用GitLab,您可以定义秘密环境变量,以便将您的注册表凭据传递给Jib。请注意保留HTML标签。
  1. Define secret variables using gitlab
  2. Pass the registry credential using Jib

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

0

0

https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#authentication-methods提到可以使用凭据助手或直接将凭据放在maven设置中。尽管称这些为“docker凭据助手”,但我认为这些凭据助手实际上并不使用docker守护程序,而只是使用适当的本地存储来存储凭据,并在jib需要对图像进行身份验证以将其推送到与docker API兼容的注册表时将其传递给jib。

https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#quickstart 区分了构建到docker守护程序和构建到注册表的方式,所以我的猜测是如果你构建到注册表,就不需要访问守护程序,这意味着你只需要一个能够运行maven的镜像。

当然,正是这种模糊、未经测试的建议才导致你首次来到这里,对吧....


谢谢您的评论。关于第一点,我的问题是,正如您所说,凭据似乎被存储并在JIB尝试连接到注册表时传递。不确定docker CLI是否需要对JIB可用来执行此操作。这是我找到的仅有的一个使用GitLab注册表的示例https://aboullaite.me/gitlab-registry-jib-java/,它建议通过在本地机器上使用docker login进行身份验证。因此,他并没有通过GitLab-CI流水线进行身份验证。 - L. Cooper
在这篇文章中,明确提到:我更喜欢使用Maven设置与Maven密码加密相结合的方式来保护我的私有仓库的凭据。因此配置应该放置在您的settings.xml文件中,如下所示: registry.gitlab.com Username ENCRYPTED_PASSWORD - Aboullaite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接