如何在Jenkins声明性管道中从docker hub推送和拉出

akc*_*c42 10 jenkins docker jenkins-pipeline

我正在使用标准的"sh"命令成功构建来自我的jenkinsfile管道上的docker镜像.

我希望能够尝试从docker/hub中提取图像,如果它失败了(因为它尚未保存),请构建它并将其推送到docker hub.

显然,我需要存储docker hub的凭据并将它们提供给docker login命令.

我的问题是我很困惑.有docker管道插件,但我认为它们是用于在docker容器中运行jenkins步骤 - 而不是我想要做的事情.此外,许多示例似乎是脚本化管道而不是声明性.

在简单的"步骤"术语中,我认为我想要做的事情

agent {
    label 'pi'
}
steps {
  sh 'docker login -u my-account -p xxxx'
  sh 'docker pull my-account/image:version || (docker build -f dockerfile -t my-account/image:version && docker push my-account/image:version)'
....
}
Run Code Online (Sandbox Code Playgroud)

但我也怀疑我可能需要做类似的事情

steps {
  script {
    withDockerRegistry([credentialsId: 'something', url: 'docker.io/my-account']) {
      sh 'docker pull my-account/image:version || (docker build -f dockerfile -t my-account/image:version && docker push my-account/image:version)'
    ....
  }
}
Run Code Online (Sandbox Code Playgroud)

但我不想犯任何错误,并且除了这一点之外,还要搞一个目前工作正常的管道.

我是沿着正确的路线吗?

her*_*erm 7

如果你有Docker管道插件,你可以像这样创建和推送图像.

dir(config.buildFolder){
                newImage = docker.build(${imageTag})
                docker.withRegistry("https://${registryAddress}", '${credentialsId}'){
                     newImage.push("${variables.version}")

            }
Run Code Online (Sandbox Code Playgroud)

您可以在容器内拉取并执行一些代码,如下所示:

testbed = docker.image('${imageName}')
testbed.inside("-u root:root"){
                echo 'executing build inside container'
                sh 'dotnet restore'
            }
Run Code Online (Sandbox Code Playgroud)

这将自动挂载您创建容器的文件夹作为容器的根目录,以便您可以使用该数据(如构建应用程序)


小智 3

我也在研究同样的问题。我希望从我的 Dockerhub 存储库中提取 Docker 映像并使用它们执行一些测试。我已按照此处显示的步骤设法使我的管道正常工作。

https://gist.github.com/jglick/0aa389c053196e38e2a1

  • 也许最好将步骤包含在答案本身中,而不是将其隐藏在链接后面? (5认同)
  • @Swagrid 这看起来像一个脚本化的管道? (3认同)
  • 这是脚本化的,而不是声明性的管道,这不是请求。 (2认同)