强制Jenkins流水线作业从Dockerhub拉取新的私有镜像

7
我希望通过Jenkins Docker pipeline插件拉取Docker Hub上特定标签的私有镜像的新版本。相应的Docker shell命令如下:
docker login -u user -p password
docker pull user/foo:bar

像这样的东西似乎应该能够工作:
node () {
    image = docker.image('user/foo:bar')
    image.pull()
    image.inside {
        // Commands to run in the container

但是没有办法执行登录步骤,所以我总是会收到错误提示:
Error response from daemon: pull access denied for user/foo, repository does not exist or may require 'docker login'.

我已经阅读了文档代码,但是文档中甚至没有提到拉取操作,而且代码示例也没有展示如何登录以拉取私有镜像。我可以手动编写脚本,但使用Docker pipeline插件的整个目的是避免直接编写Docker命令。
1个回答

11

我相信你需要的是 withRegistry 函数。 它可以按以下方式使用

docker.withRegistry('<registry-url>', '<credential-id>') {
    image = docker.image('user/foo:bar')
    image.pull()
}

withRegistry块中的所有内容都将使用该注册表和身份验证来拉取镜像。

在本例中,<registry-url>是Dockerhub注册表的URL。我相信Dockerhub注册表的URL是 https://registry.hub.docker.com

<credential-id> 是存储在Jenkins中的Dockerhub凭据的ID。

要添加这些凭据,请从Jenkins索引页面导航到 Credentials -> System -> Global credentials -> Add Credentials

在此页面上,您需要选择KindUsername with password。 范围应该是Globalusernamepassword字段是您在Dockerhub的用户名和密码。

ID字段可以是任何文本,例如如果您将ID字段设置为docker-hub-credentials,那么它将成为withRegistry的第二个参数。

以下是添加凭据页面的示例。 enter image description here


我尝试使用Registry和其他几个Dockerhub URL,但我无法成功登录Dockerhub。我基本上按照这里的介绍操作。我需要做些什么别的吗? - ceridwen
@ceridwen 你在 Jenkins 中添加了你的 Dockerhub 凭据吗? - Matt McCoy
是的,我做到了。使用docker login,我甚至成功地拉取了镜像,只是我从未成功使用withRegistry()。 - ceridwen
你能具体展示一下你是如何调用 withRegistry 的吗? - Matt McCoy
运作得非常好 - Eliseo Ocampos
由于某种原因,现在它可以工作了,而之前却不能。谢谢! - ceridwen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接