使用Kaniko构建多镜像并推送到GitLab同项目仓库遇权限问题求助
解决方案
核心思路
问题根源是Kaniko尝试推送的镜像仓库路径projs/devs/frontend-ecomm不存在,需将所有镜像的推送路径统一指向已存在的projs/devs/frontend仓库,通过不同标签区分多阶段构建出的两个镜像。
1. 调整镜像标签规则
为两个阶段的镜像设置带区分后缀的标签,确保推送路径匹配GitLab现有仓库:
- 构建阶段镜像:
gitlab.xxx.de:8085/projs/devs/frontend:builder-v38.3-54c2e0d7 - 运行阶段镜像:
gitlab.xxx.de:8085/projs/devs/frontend:runtime-v38.3-54c2e0d7
2. 配置Kaniko构建命令(GitLab CI场景)
分两次执行Kaniko构建,通过--target指定对应阶段,并推送至正确路径:
build-builder-image: stage: build image: gcr.io/kaniko-project/executor:debug script: # 生成Docker认证配置 - echo "{\"auths\":{\"gitlab.xxx.de:8085\":{\"auth\":\"$(echo -n "$CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD" | base64)\"}}}" > /kaniko/.docker/config.json # 构建并推送builder阶段镜像 - /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --target builder --destination "gitlab.xxx.de:8085/projs/devs/frontend:builder-${CI_COMMIT_SHORT_SHA}" --cache=true build-runtime-image: stage: build image: gcr.io/kaniko-project/executor:debug script: - echo "{\"auths\":{\"gitlab.xxx.de:8085\":{\"auth\":\"$(echo -n "$CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD" | base64)\"}}}" > /kaniko/.docker/config.json # 构建并推送runtime阶段镜像 - /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --target runtime --destination "gitlab.xxx.de:8085/projs/devs/frontend:runtime-${CI_COMMIT_SHORT_SHA}" --cache=true
3. (可选)Dockerfile添加阶段标记
在Dockerfile的每个阶段添加LABEL,方便后续识别镜像用途:
FROM node:18 AS builder LABEL image-stage=builder WORKDIR /app COPY . . RUN npm install && npm run build FROM nginx:alpine AS runtime LABEL image-stage=runtime COPY --from=builder /app/dist /usr/share/nginx/html
关键注意事项
- 确保Kaniko使用的
CI_REGISTRY_USER和CI_REGISTRY_PASSWORD拥有projs/devs/frontend项目的镜像推送权限 - 所有
--destination参数必须严格匹配已存在的GitLab项目容器仓库路径,禁止使用不存在的frontend-ecomm路径 - 通过标签后缀(如
builder-、runtime-)区分不同阶段的镜像,避免相互覆盖
内容的提问来源于stack exchange,提问作者CodeWeed
相关产品推荐
相关产品推荐

