我们面临一个问题,无法使用 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 身份验证。
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" ]
FROM alpine:latest
CMD [ "echo", "Hello World" ]
在 kaniko 目录中,运行
docker build .
kaniko
|__ Dockerfile
|__ Dockerfile.test
这个确切的案例在官方文档
中有描述无法为 Docker 客户端提供应用程序上下文路径或基本注册表路径。 Docker 需要在其访问的主机+端口的根目录下公开注册表。
检查反向代理策略以获取指导,但通常归结为:
private.registry.com:8091/imagename:tag
repository.private.registry.com
重定向到private.registry.com:8091
,然后在kaniko中使用
repository.private.registry.com/imagename:tag
有点偏离主题,但您也可以摆脱 Nexus 并使用 Harbor 代替,它支持开箱即用的
private.registry.com/repository/imagename:tag
场景。