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

如何在Jenkinsfile定义的Docker容器中通过SSH连接本地网络节点

解决方案

你可以通过两种方式实现容器读取SSH密钥,无需自定义打包镜像:

方案1:挂载宿主机SSH目录(适配单Jenkins节点场景)

直接将宿主机上已有的.ssh目录挂载到InSpec容器的对应用户家目录下,修改你的Jenkinsfile docker agent配置,添加args参数即可:

stage('test') {
    agent {
        docker {
            image 'chef/inspec:latest'
            reuseNode true
            // 挂载宿主机ssh目录到容器root用户家目录,同时使用宿主机网络解决本地域名解析/访问问题
            args '-v /root/.ssh:/root/.ssh --network=host'
        }
    }
    steps {
        script {
            parallel inspecTestStages(hosts, profiles)
        }
    }
}

注意事项:

  • 如果你的宿主机执行Jenkins agent的用户不是root,需要把前面的路径替换为对应用户的.ssh目录路径,比如/home/jenkins/.ssh:/root/.ssh
  • 要保证宿主机上的私钥文件权限为600,避免SSH因为权限问题拒绝读取密钥

方案2:通过Jenkins凭证注入密钥(适配多Jenkins节点/更安全的场景)

更推荐使用Jenkins内置的凭证管理器存储私钥,避免私钥散落在各个宿主机节点:

  1. 先在Jenkins后台「凭证」管理中新增类型为「SSH Username with private key」的凭证,填写你用于SSH登录的用户名、私钥内容,设置凭证ID为inspec_ssh_private_key
  2. 修改Jenkinsfile,在执行inspec命令前临时注入密钥:
stage('test') {
    agent {
        docker {
            image 'chef/inspec:latest'
            reuseNode true
            args '--network=host'
        }
    }
    steps {
        withCredentials([sshUserPrivateKey(
            credentialsId: 'inspec_ssh_private_key',
            keyFileVariable: 'SSH_KEY_PATH'
        )]) {
            script {
                // 把密钥复制到SSH默认读取路径,设置正确权限
                sh 'mkdir -p ~/.ssh && cp $SSH_KEY_PATH ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa'
                parallel inspecTestStages(hosts, profiles)
            }
        }
    }
}

注意事项:

  • 如果你的InSpec测试命令中指定了不同的SSH用户名,可在凭证配置中填写默认用户名,也可以通过usernameVariable参数拿到凭证中存储的用户名传入inspec命令
  • 流水线执行完成后,临时创建的密钥文件会随容器销毁自动清除,不会留下敏感信息残留

内容的提问来源于stack exchange,提问作者Sebastian Sommerfeld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:15:03