如何在Jenkinsfile中用docker run返回值设置环境变量
问题描述
我有一个会输出大于等于0数值的Docker容器,本地运行时通过以下命令获取输出值:
docker build -t tmp -f Dockerfile . id=$(docker run --rm -v /mnt/BARAT_Data1/Weather_Files/NOAA_Forecasts:/weather_dir tmp) echo $id # Prints 0
将逻辑写入Jenkins Pipeline脚本后,env.NUM_PROCESSED被输出为null,脚本如下:
stage("Run download process") { when { expression{currentBuild.currentResult == 'SUCCESS'} } steps { sh """ docker rm -f sync_noaa || true rm -rf ${WEATHER_DIR}/staging/* """ script { env.NUM_PROCESSED=sh(script:'docker run --rm -v ${WEATHER_DIR}:/weather_dir ${DOCKER_TAG}', returnStdout: true).trim() } sh """ echo ${env.NUM_PROCESSED} """ } }
尝试多种Shell命令设置Jenkins环境变量的方法均无效,请问如何通过docker run命令的输出值设置Jenkins环境变量?
解决方案
核心问题:Groovy字符串变量替换失效
你的Jenkins脚本中,sh指令使用了单引号包裹脚本内容,而Groovy中单引号字符串是字面量,不会替换其中的${WEATHER_DIR}和${DOCKER_TAG}变量,导致实际执行的docker run命令使用了未定义的shell变量,容器挂载路径错误或找不到镜像,最终没有输出内容,trim()后得到null。
修复步骤
- 修改字符串引号类型
将sh指令的脚本内容改用双引号包裹,让Jenkins提前替换变量:
script { env.NUM_PROCESSED = sh( script: "docker run --rm -v ${WEATHER_DIR}:/weather_dir ${DOCKER_TAG}", returnStdout: true ).trim() }
- 验证容器输出渠道
确保Docker容器的数值输出是通过**标准输出(stdout)**打印的,如果容器误将内容输出到标准错误(stderr),需要合并输出到stdout,修改命令为:
script { env.NUM_PROCESSED = sh( script: "docker run --rm -v ${WEATHER_DIR}:/weather_dir ${DOCKER_TAG} 2>&1", returnStdout: true ).trim() }
- 排查容器执行状态
可以先在Jenkins中单独执行docker run命令,查看控制台输出是否符合预期:
sh "docker run --rm -v ${WEATHER_DIR}:/weather_dir ${DOCKER_TAG}"
如果控制台没有输出预期数值,需要检查容器内部逻辑是否正常输出内容。
内容的提问来源于stack exchange,提问作者Tom McLean
相关产品推荐
相关产品推荐

