Gitlab CI执行docker tag时报错No such image该如何解决?
问题原因
- GitLab CI 每个Job运行在独立的隔离环境中,和你本地环境完全无关。你注释掉了
heroku_publishing任务中依赖build任务的needs配置,就算没注释,默认build任务构建的镜像也不会自动传递到后续任务的环境中,所以heroku_publishing任务执行打标签操作时,当前Job的docker环境里根本不存在fagam32/study_project_backend:latest镜像,直接触发报错。 - 本地执行正常是因为你本地环境已经提前构建好了该镜像,CI环境没有这个前置条件。
解决方案
方案一:合并构建和推送逻辑到同一个Job
直接在heroku_publishing任务中完成镜像构建、打标签、推送全流程,不需要跨Job传递镜像,配置修改如下:
heroku_publishing: stage: publish_image services: - docker:dind script: - docker login --username=$DOCKER_LOGIN --password=$DOCKER_PASSWORD # 新增镜像构建步骤 - docker build -t fagam32/study_project_backend:latest . - docker login --username=_ --password=$HEROKU_AUTH_KEY registry.heroku.com - docker tag fagam32/study_project_backend:latest registry.heroku.com/study-project-backend/release - docker push registry.heroku.com/study-project-backend/release allow_failure: false
这种方案逻辑最简单,也不会有跨Job传递资源的额外开销。
方案二:保留独立构建和推送Job,补充镜像拉取逻辑
如果你需要保留单独的build构建Job,先在build Job中将构建好的镜像推送到Docker Hub,再在heroku_publishing Job中先拉取镜像再操作,配置修改如下:
build: stage: build services: - docker:dind script: - docker login --username=$DOCKER_LOGIN --password=$DOCKER_PASSWORD - docker build -t fagam32/study_project_backend:latest . - docker push fagam32/study_project_backend:latest heroku_publishing: stage: publish_image services: - docker:dind script: - docker login --username=$DOCKER_LOGIN --password=$DOCKER_PASSWORD # 新增拉取提前构建好的镜像步骤 - docker pull fagam32/study_project_backend:latest - docker login --username=_ --password=$HEROKU_AUTH_KEY registry.heroku.com - docker tag fagam32/study_project_backend:latest registry.heroku.com/study-project-backend/release - docker push registry.heroku.com/study-project-backend/release # 恢复对build任务的依赖 needs: - build allow_failure: false
内容的提问来源于stack exchange,提问作者Fagam32
相关产品推荐
相关产品推荐

