GitLab流水线中Docker无法使用本地镜像的问题求助
我最近在搭建带有Docker-in-Docker的GitLab流水线,已经通过Dockerfile构建了docker-c本地镜像,手动在命令行执行docker run -it docker-c sh完全正常,但放到GitLab流水线里运行时,它好像完全无视本地已有的这个镜像,一个劲往DockerHub上查找,最终拉取失败报错。
附上作业输出:
Running with gitlab-runner 17.3.1 (66269445)
on runner3 71qiPF29, system ID: s_2acc9531e625
Preparing the "docker" executor
00:07
Using Docker executor with image mcr.microsoft.com/powershell ...
Starting service docker-c:latest...
Pulling docker image docker-c:latest ...
WARNING: Failed to pull image with policy "always": Error response from daemon: pull access denied for docker-c, repository does not exist or may require 'docker login': denied: requested access to the resource is denied (manager.go:251:3s)
ERROR: Job failed: failed to pull image "docker-c:latest" with specified policies [always]: Error response ...
给你几个可行的解决思路:
调整镜像拉取策略
GitLab Runner默认拉取策略是always,不管本地有没有都会尝试从远程仓库拉取。你可以在.gitlab-ci.yml中给该服务镜像单独设置拉取策略为if-not-present,这样Runner会优先检查本地镜像,不存在时再去远程拉取:services: - name: docker-c:latest pull_policy: if-not-present若想全局修改,可编辑Runner的
config.toml配置文件,找到对应Runner的pull_policy字段改为if-not-present,修改完成后重启Runner服务即可。确保Runner能访问本地镜像
如果你使用的是Docker executor,需要注意Runner的Docker daemon和你本地构建镜像的Docker daemon是否为同一个。如果Runner运行在容器中,它默认使用自身的Docker daemon,无法识别主机上的本地镜像。这种情况下,你可以将主机的Docker socket挂载给Runner,在config.toml的[runners.docker]部分添加:volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]这样Runner就会和主机共享Docker daemon,自然能找到你本地的
docker-c镜像。推送到私有仓库(备选方案)
要是上面两种方法都不适用,也可以将docker-c镜像推送到GitLab容器注册表或其他私有仓库,然后在流水线中配置好登录凭证,让Runner能够正常拉取。比如推送到GitLab容器注册表的步骤大致如下:docker tag docker-c:latest registry.gitlab.com/你的项目路径/docker-c:latest docker login registry.gitlab.com docker push registry.gitlab.com/你的项目路径/docker-c:latest之后在
.gitlab-ci.yml中使用这个私有镜像地址即可,记得确保Runner拥有该仓库的访问权限。
备注:内容来源于stack exchange,提问作者Den

