解决 Gitlab CI/CD 构建 Docker 镜像失败的问题

41次阅读
没有评论

问题描述

在使用 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 builddocker 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 logindocker build 是由不同的用户执行,或者是由于共享的凭证文件可能会导致权限问题。您可以通过确认用户执行上下文和使用预定义变量来解决这些问题,并确保在不同的操作之间共享凭证时不会出现冲突。

正文完