问题描述
在设置一个新的 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 用户并执行相同的登录和拉取命令。
- 切换到 jenkins 用户:
su jenkins
- 登录到 Nexus:
docker login https://our.nexus.internal:<endpoint>
- 尝试拉取镜像:
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 和操作系统之间的交互,以找到更适合您环境的解决方案。