GitLab CI/CD交付阶段报错:找不到指定Docker镜像求助
问题根源
GitLab CI的每个Job都是独立的执行容器,Build阶段构建的Docker镜像仅存在于该Job的临时环境中,Delivery阶段的Job无法直接访问到这些镜像,因此会出现"No such image"错误。
解决方案(推荐使用GitLab容器注册表中转)
将Build阶段构建的镜像先推送到GitLab自带的容器注册表,Delivery阶段从注册表拉取后再重新打标签推送到Docker Hub,具体配置修改如下:
修改后的.gitlab-ci.yml配置
image: docker:latest services: - docker:dind stages: - build # 构建镜像并推送到GitLab Registry - test # 执行测试 - delivery # 拉取镜像并推送至Docker Hub build-backend: stage: build before_script: - docker ps -q | xargs -r docker stop - docker ps -a -q | xargs -r docker rm - docker system prune -a -f - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD script: - cd Backend - docker build -t $CI_REGISTRY_IMAGE/backend-node-prueba:latest . - docker push $CI_REGISTRY_IMAGE/backend-node-prueba:latest build-frontend: stage: build before_script: - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD script: - cd Frontend - docker build -t $CI_REGISTRY_IMAGE/frontend-react-prueba:latest . - docker push $CI_REGISTRY_IMAGE/frontend-react-prueba:latest run-tests: image: node:18 stage: test script: - cd Backend - npm install - npm test publish-backend-image: stage: delivery before_script: - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD - docker login --username myuser --password $DOCKER_TOKEN script: - docker pull $CI_REGISTRY_IMAGE/backend-node-prueba:latest - docker tag $CI_REGISTRY_IMAGE/backend-node-prueba:latest myuser/backend-node-prueba:latest - docker push myuser/backend-node-prueba:latest publish-frontend-image: stage: delivery before_script: - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD - docker login --username myuser --password $DOCKER_TOKEN script: - docker pull $CI_REGISTRY_IMAGE/frontend-react-prueba:latest - docker tag $CI_REGISTRY_IMAGE/frontend-react-prueba:latest myuser/frontend-react-prueba:latest - docker push myuser/frontend-react-prueba:latest
说明:
- 利用GitLab CI内置的
CI_REGISTRY、CI_REGISTRY_USER、CI_REGISTRY_PASSWORD变量自动完成GitLab容器注册表的认证,无需手动配置。 - Build阶段完成镜像构建后立即推送到GitLab Registry,确保Delivery阶段可以拉取到镜像。
其他可选方案(不推荐)
- 合并Build和Delivery到同一Job:将构建与推送步骤放在同一个Job中,镜像会保存在同一环境,但会破坏流水线的阶段划分,不利于调试和流程管控。
- 使用Runner本地缓存:配置GitLab Runner使用本地Docker存储,但仅适用于单Runner环境,多Runner节点无法保证镜像共享,可靠性低。
内容的提问来源于stack exchange,提问作者Pedro Castro
相关产品推荐
相关产品推荐

