如何捕获Jenkins中docker.Image.run()运行容器的stdout标准输出
Jenkins中使用
docker.Image.run()捕获容器stdout的实现方法 首先明确结论:Jenkins Docker 插件提供的原生docker.Image.run()方法本身没有直接返回stdout的设计,它的返回值是docker.Container类型的容器实例对象,仅包含容器ID等元数据。你可以通过以下两种官方支持的方式实现输出捕获:
方案1:利用容器实例的logs()方法获取输出
这是完全基于docker.Image.run()原生能力的实现方案,注意不要给启动参数加--rm,否则容器执行完成后会被立即删除,无法读取日志:
pipeline { agent any stages { stage("获取GitVersion输出") { steps { script { def img = docker.image("gittools/gitversion:5.6.6") // 启动容器,不要加--rm参数,返回容器实例 def container = img.run('-v "$(pwd):/repo"', '/repo') // 阻塞等待容器执行完成 container.waitFor() // 获取容器的stdout输出,trim()可以去除首尾换行符 def gitversionJson = container.logs().trim() // 手动清理容器,避免节点残留无用容器 container.remove() // 后续可以直接解析JSON使用 def versionInfo = readJSON text: gitversionJson echo "当前版本号: ${versionInfo.FullSemVer}" } } } } }
方案2:使用inside()方法更简洁地执行命令并捕获输出
如果不强制要求仅用run()方法,Docker插件提供的inside()方法更适合执行容器内命令并捕获输出,语法更简洁,无需手动管理容器生命周期:
script { def img = docker.image("gittools/gitversion:5.6.6") def gitversionJson = img.inside('-v "$(pwd):/repo"') { // 直接在容器内执行命令,通过sh步骤的returnStdout参数返回输出 sh script: 'gitversion /repo', returnStdout: true }.trim() }
注意:两种方案均基于Jenkins Docker插件的原生全局语法实现,无需手动拼接完整的
docker run命令。
内容的提问来源于stack exchange,提问作者StoneThrow
相关产品推荐
相关产品推荐

