Kaniko 无法针对 Nexus OSS 进行身份验证

问题描述 投票:0回答:1

我们面临一个问题,无法使用 kaniko 将 docker 镜像推送到我们的 nexus 注册表。下面我提供了一个最小的重现以及我们正在使用的

Nexus OSS 3.49.0-02

访问 v2 Dockerapi 时会导致 404 使用格式错误的 url 模式:

error checking push permissions -- make sure you entered the correct tag name, and that you are authenticated correctly, and try
again: checking push permission for "private.registry.com/repository/imagename:tag": creating push check transport for 
private.registry.com failed: GET https://private.registry.com/v2/: unexpected status code 404 Not Found: 
...[html]...

我们的 Gitlab-CI 脚本部分如下所示:

- echo "{\"auths\":{\"private.registry.com":{\"auth\":\"$NEXUS_DEPLOY_USER_PW_BASE64\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor
      --context "${CI_PROJECT_DIR}/frontend"
      --dockerfile "${CI_PROJECT_DIR}/frontend/Dockerfile.app-builder"
      --build-arg=CI_COMMIT_SHA=$CI_COMMIT_SHA
      --build-arg=CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH
      --build-arg=CI_COMMIT_TAG=$CI_COMMIT_TAG
      --destination "$BASE_URL/app-ui:$APP_VERSION"
      --destination "$BASE_URL/app-ui:$BRANCH_TAG"
      --destination "$BASE_URL/app-ui"

它也不适用于非 Base64 编码的凭据

NEXUS_DEPLOY_USER_PW_BASE64
。所以我在复制示例中提供了非 Base64 身份验证。

复制:

Dockerfile

FROM gcr.io/kaniko-project/executor:v1.14.0-debug

ADD Dockerfile.test Dockerfile.test

ARG REGISTRY_URL=[YOUR_NEXUS_URL]/repository/dockercontainer
ARG REGISTRY_USER=[your credential]
ARG REGISTRY_PASSWORD=[your credential]

RUN echo "{\"auths\":{\"$REGISTRY_URL\":{\"username\":\"$REGISTRY_USER\",\"password\":\"$REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json

RUN /kaniko/executor --context "." --dockerfile "Dockerfile.test" --destination "${REGISTRY_URL}/test:latest"

CMD [ "echo", "Hello World" ]

Dockerfile.测试

FROM alpine:latest
CMD [ "echo", "Hello World" ]

文件夹结构

在 kaniko 目录中,运行

docker build .

kaniko
  |__ Dockerfile
  |__ Dockerfile.test
docker gitlab-ci nexus kaniko
1个回答
0
投票

这个确切的案例在官方文档

中有描述

无法为 Docker 客户端提供应用程序上下文路径或基本注册表路径。 Docker 需要在其访问的主机+端口的根目录下公开注册表。

检查反向代理策略以获取指导,但通常归结为:

  1. 在 Nexus 中为您的存储库指定 http 或 https 端口,即 http 端口 8081
  2. 在 kaniko 中按原样使用它,即
    private.registry.com:8091/imagename:tag
  3. (或者)配置反向代理将请求从
    repository.private.registry.com
    重定向到
    private.registry.com:8091
    ,然后在kaniko
    中使用
    repository.private.registry.com/imagename:tag

有点偏离主题,但您也可以摆脱 Nexus 并使用 Harbor 代替,它支持开箱即用的

private.registry.com/repository/imagename:tag
场景。

© www.soinside.com 2019 - 2024. All rights reserved.