1

我正在尝试创建一个管道,其中使用 JIB(通过 Maven 插件)创建 docker 图像并将其推送到我的 Gitlab 注册表。

当我登录到我的 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 [username] -p [password/token]

我怎么会需要一个使用 docker-in-docker 映像的 .gitlab-ci.yml 才能在我的脚本中运行 docker login?

除了使用 docker-in-docker 映像在我的 Gitlab CI 上构建此映像之外,还有其他方法吗?

4

5 回答 5

6

从 GitLab 9.0 开始,所有必要的变量都默认可用

  • CI_REGISTRY-- 项目注册地址
  • CI_REGISTRY_IMAGE-- 项目注册表的“base”镜像名称
  • 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 注册表上进行身份验证一样。

于 2020-12-02T16:03:07.690 回答
3

使用 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
    
于 2019-09-20T17:40:42.223 回答
2

对于 Gradle 用户:

 ./gradlew jib \
 -Djib.to.image=${CI_REGISTRY_IMAGE}:latest \
 -Djib.to.auth.username=${CI_REGISTRY_USER} \
 -Djib.to.auth.password=${CI_REGISTRY_PASSWORD}
于 2021-08-22T10:21:36.210 回答
0

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

https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#quickstart 将构建到 docker 守护进程与构建到注册表区分开来,所以我的猜测是如果您构建到不需要的注册表一个可访问的守护进程,这意味着您只需要一个能够运行 maven 的映像。

当然,正是这种含糊的、未经检验的建议首先把你带到了这里……

于 2019-02-14T11:26:32.053 回答
0

您可以使用明确的用户名和密码配置 Jib。但请注意,除非明确配置,否则Jib 不会通过未加密的连接发送密码-DsendCredentialsOverHttp

于 2019-09-20T15:57:21.657 回答