问题描述
在使用 Gitlab CI/CD 构建 Docker 镜像时遇到了问题。他已经创建了一个自定义的基础镜像,用于作为开发的 Ruby 服务的基础镜像。他在 Gitlab 中使用了 Docker 镜像存储库,并为每个项目创建了自己的 Docker 镜像存储。他在一个单独的项目中创建了名为 alpine-ruby-service 的 Dockerfile,并且已经成功构建并将镜像推送到了 Gitlab。在 Ruby 服务项目的 Docker 镜像中,他通过引用以下方式使用它:
FROM gitlab.mycompany.dk/alpine-ruby-service-base...
他的问题是,当运行 CI/CD 流水线时,构建失败,并显示以下错误信息:
$ docker build --pull -t $CONTAINER_TEST_IMAGE .
Sending build context to Docker daemon 709.6kB
Step 1/13 : FROM gitlab.mycompany.dk:xxxx/alpine-ruby-service-base
pull access denied for gitlab.mycompany.dk:xxxx/alpine-ruby-service-base, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
他在构建命令之前使用了 docker login
命令来登录到 Gitlab 的 Docker 镜像仓库,登录成功了,但是在构建命令中仍然失败。他希望能够找到问题所在并得到解决。
解决方案
请注意以下操作可能涉及版本差异,且在操作前请备份相关数据。
方案1
这个问题可能是因为 docker build
和 docker login
是由不同的用户执行的。如果 docker login
是由用户 X 执行的,那么在该用户的命名空间下将创建一个 ~/.docker
目录。如果 docker build
是由用户 Y 执行的,那么后者可能没有 .docker
文件夹,并且没有权限拉取镜像。您可以在 CI/CD 流水线(.gitlab-ci.yml
)中通过添加 echo $USER
来检查当前用户,以确认这一点。
方案2
另一个可能性是,如果在 gitlab runner 中在 docker pull
前执行了 docker login
,那么也可能出现这个问题,特别是在以下情况下:
– 您的 shell runner 配置为运行多个构建,并且所有构建共享相同的主目录 /home/gitlab-runner-username
。
– 默认情况下,docker login
会将凭证保存在 ~/.docker/config.json
文件中。
– 当有多个构建作业同时运行时,第二个构建可能会覆盖第一个构建的凭证。
– 如果第二个构建由不同的用户触发,或者在第一个构建之前完成,那么第一个构建可能会出现 denied: requested access to the resource is denied
错误。
在解决方案中,您可以考虑使用自定义的凭证脚本,以避免将凭证保存在共享文件中,而是使用存在于 Gitlab CI 作业环境中的凭证。这可以通过使用 Gitlab CI 的预定义变量来实现。
提示:这里是一个示例的凭证脚本。
总结
如果您在 Gitlab CI/CD 中遇到构建 Docker 镜像失败的问题,可能是因为 docker login
和 docker build
是由不同的用户执行,或者是由于共享的凭证文件可能会导致权限问题。您可以通过确认用户执行上下文和使用预定义变量来解决这些问题,并确保在不同的操作之间共享凭证时不会出现冲突。