解决 Jenkins 中 Docker 登录问题:docker pull 无法工作,但 docker-compose 可以正常拉取

71次阅读
没有评论

问题描述

在设置一个新的 Jenkins 实例时,用户遇到了一个问题:通过 docker exec ... 进入容器后,成功登录 Sonatype Nexus 获取 Docker 镜像,但是 Jenkins 后续似乎没有正确地使用这个登录信息,无法拉取镜像。尽管登录成功,认证凭证已写入 /root/.docker/config.json,经过 base64 解码后的凭证也是正确的 “jenkins:”,但仍然无法执行 docker pull。该问题在 Jenkins Pipeline 中同样存在。

解决方案

在处理这个问题时,有一些可能的解决方案。以下方案供您选择,尝试它们以解决您的问题。

请注意以下操作可能涉及到版本差异及修改前请做好备份。

方案1:使用正确的 Jenkins 用户身份执行 Docker 命令

根据您提供的信息,所有的 Docker 命令都是以 root 用户身份执行的,但是一般来说,应该使用 jenkins 用户身份来执行 Docker 命令。尝试切换到 jenkins 用户并执行相同的登录和拉取命令。

  1. 切换到 jenkins 用户:su jenkins
  2. 登录到 Nexus:docker login https://our.nexus.internal:<endpoint>
  3. 尝试拉取镜像:docker pull https://our.nexus.internal:<endpoint>/myImage:myTag

方案2:使用 Docker 插件执行 Docker 命令(适用于 Jenkins Pipeline)

在 Jenkins Pipeline 中,您可以使用 Docker 插件来执行 Docker 相关的命令。这样可以确保在正确的用户身份下执行这些命令。

node {
    def dockerImage = docker.build('myapp')
    docker.withRegistry('https://docker.mycorp.com/', 'docker-login') {
        // 在这里执行您的 Docker 相关命令,例如:docker.build()、docker.image() 等
    }
}

方案3:使用正确的 Docker 安装方法

从您提供的信息中,当使用官方文档提供的方法安装 Docker 时,问题得到了解决。如果您之前使用的是 yum install -y docker 来安装 Docker,而现在使用官方文档的方法来安装 Docker,则说明这可能是一个与 CentOS 官方源提供的 Docker 包有关的问题。如果您的问题得到了解决,那么可以继续使用这个方法。

结论

在尝试了上述解决方案后,您应该能够解决 Jenkins 中 Docker 登录的问题。根据您的环境和需求,选择适合您情况的解决方案。如果问题仍然存在,您可能需要深入了解 Docker、Jenkins 和操作系统之间的交互,以找到更适合您环境的解决方案。

正文完