You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Jenkinsfile中的Shell脚本在Docker容器内执行?

解决Jenkins Pipeline中Shell脚本未在Docker容器内执行的问题

我来帮你搞定这个问题!你遇到的情况是Jenkins Pipeline里一个很常见的小细节问题——docker.image.inside()的闭包用法没写对,导致Shell命令跑到宿主机上了。

核心原因

你写的代码里,虽然调用了inside(),但要确保所有需要在容器内执行的命令都被包裹在inside()的闭包(大括号)里。如果命令在闭包外面,自然会在宿主机环境执行。

正确的写法示例

不管你用声明式还是脚本式Pipeline,核心都是把要在容器内跑的逻辑放进inside()的闭包中。这里给你两种常见场景的写法:

1. 声明式Pipeline(最常用)

pipeline {
    agent any
    stages {
        stage('执行容器内命令') {
            steps {
                script {
                    // 替换成你需要的Docker镜像,比如maven:3.8-openjdk-11
                    docker.image('ubuntu:latest').inside {
                        // 这里的所有sh命令都会在Docker容器内运行
                        def containerWorkDir = sh(
                            script: 'pwd',
                            returnStdout: true
                        ).trim()
                        echo "容器内的工作目录: ${containerWorkDir}"
                        // 可以加更多容器内的操作,比如安装依赖、编译代码等
                        sh 'apt-get update && apt-get install -y curl'
                        sh 'curl --version'
                    }
                }
            }
        }
    }
}

2. 脚本式Pipeline

// 直接写脚本逻辑,不需要pipeline包裹
node {
    stage('容器内执行') {
        docker.image('ubuntu:latest').inside {
            def containerPwd = sh(script: 'pwd', returnStdout: true).trim()
            echo "容器内PWD: ${containerPwd}"
        }
    }
}

关键注意事项

  • 闭包范围:一定要把所有容器内的操作放在inside()的大括号里,哪怕是变量赋值依赖容器内的输出,也要放在闭包内。
  • 声明式Pipeline必须用script块:声明式语法本身不支持Docker的方法调用,所以需要把Docker相关代码放在script块中。
  • 镜像权限与拉取:确保Jenkins代理节点能正常拉取指定的Docker镜像,并且Jenkins用户有访问Docker daemon的权限(比如加入docker用户组)。
  • 错误写法避坑:别犯这种低级错误——把命令写在闭包外面:
// ❌ 错误!sh命令会在宿主机执行
docker.image('ubuntu:latest').inside {}
def pwd = sh(script: 'pwd', returnStdout: true).trim()

按照这个写法调整后,你的pwd命令就会在Docker容器内执行,返回的是容器内的工作目录啦。

内容的提问来源于stack exchange,提问作者Prem Sompura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:39:48