GitLab Runner无法从Google Artifact Registry拉取镜像求助
解决GitLab Runner无法拉取GCP Artifact Registry镜像的问题
问题背景
在GCP容器优化OS的VM上通过Docker部署GitLab Runner,VM本地Docker可正常拉取Artifact Registry镜像,但Runner的Docker执行器拉取时抛出权限错误:
ERROR: Job failed: failed to pull image "europe-west1-docker.pkg.dev//staging//:" with specified policies [always]: Error response from daemon: Head "https://europe-west1-docker.pkg.dev/v2//staging///manifests/": denied: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects//locations/europe-west1/repositories/staging" (or it may not exist)
解决方案
1. 修正镜像地址格式
报错中的镜像地址存在多余斜杠且缺少项目ID、镜像名和标签,这会导致地址解析失败。正确格式应为:
europe-west1-docker.pkg.dev/<你的GCP项目ID>/staging/<镜像名称>:<标签>
示例:
europe-west1-docker.pkg.dev/my-gcp-project/staging/my-node-app:latest
2. 为VM的Docker Daemon配置凭证
你在个人用户下执行的docker-credential-gcr configure-docker仅配置了当前用户的Docker凭证,但VM的Docker Daemon以root用户运行,会读取/root/.docker/config.json的配置。执行以下命令为root用户配置Artifact Registry凭证:
sudo docker-credential-gcr configure-docker --registries europe-west1-docker.pkg.dev
验证root用户能否正常拉取镜像:
sudo docker pull europe-west1-docker.pkg.dev/<你的GCP项目ID>/staging/<镜像名称>:<标签>
3. 调整GitLab Runner容器的挂载配置
修改Runner启动命令,确保挂载root用户的Docker配置文件到容器内的对应路径,让Runner能使用正确的凭证:
docker run -d --name gitlab-runner --restart always --log-driver none \ -v /home/<user_name>/srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /root/.docker/config.json:/root/.docker/config.json:ro \ gitlab/gitlab-runner:latest
若需直接使用VM的服务账号凭证(更可靠),可额外挂载服务账号目录:
docker run -d --name gitlab-runner --restart always --log-driver none \ -v /home/<user_name>/srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /root/.docker/config.json:/root/.docker/config.json:ro \ -v /run/secrets/google.com/service-account/default:/run/secrets/google.com/service-account/default:ro \ gitlab/gitlab-runner:latest
4. 重启GitLab Runner容器
修改配置后,重启Runner使变更生效:
docker restart gitlab-runner
5. 验证Runner权限
在GitLab CI任务中添加测试步骤,确认镜像拉取正常:
test-pull-image: stage: test script: - docker pull europe-west1-docker.pkg.dev/<你的GCP项目ID>/staging/<镜像名称>:<标签> - docker image ls | grep staging
内容的提问来源于stack exchange,提问作者anilkumar_shetty
相关产品推荐
相关产品推荐

