问题描述
目前在 Jenkinsfile 中使用 docker.build()
声明式地构建 Docker 镜像。现在他需要为 ARM64 生成特定平台的构建。为了实现这个目的,他需要使用 docker buildx build --platform linux/arm64 ...
命令。他想知道是否有办法继续使用 docker.build()
语法来生成特定平台的镜像,或者是否需要重写语法,如果需要的话,应该如何重写。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
Jenkins的 Docker Pipeline 插件目前还不支持 buildx
(可能会在未来支持)。如果你希望支持这个功能,可以在相关的问题上投票,以帮助推动这个功能的开发。如果有兴趣,可以在该问题上添加你的投票:JENKINS-61372。
不过,你仍然可以通过其他方式来实现生成特定平台的构建。Jeremie Drouet 在他的博客文章 “Multi-arch build and images, the simple way” 中介绍了一种方法,该方法首先构建镜像,然后创建一个 manifest 来将它们链接在一起。
另外,Github 上的用户 bgulla 在他的 gist 中提供了一个使用 docker.withRegistry()
在流水线中尽可能完成构建的示例。然后使用 sh
命令来创建和推送 manifest。
方案2
如果你不想使用第三方工具,你可以直接使用
sh
命令来执行docker buildx
命令。以下是一个示例:
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
sh 'docker buildx build --platform linux/arm64 ...'
}
}
}
}
}
在这个示例中,我们在流水线的 Build
阶段使用 sh
命令来执行 docker buildx build
命令,并指定 --platform linux/arm64
参数来生成特定平台的构建。
请注意,这种方法需要你的 Jenkins 环境中已经安装了 buildx
插件,并且已经配置好了相应的构建环境。
以上是两种实现在 Jenkinsfile 中使用 buildx
生成特定平台构建的方法。你可以根据自己的需求选择适合的方法来实现。