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

Jenkins Docker环境下脚本/流水线SSH克隆代码权限拒绝求助

解决Jenkins流水线在Docker容器内拉取Git仓库的SSH权限问题

我之前也碰到过一模一样的坑!手动在容器里跑SSH配置脚本完全没问题,但Jenkins一执行就报Permission denied (publickey),核心问题基本都是执行上下文不一致或者密钥的权限/路径没适配Jenkins的运行环境,给你几个亲测有效的解决思路:

1. 先确认Jenkins在容器内的执行用户

手动操作时你大概率是用root或者自己的用户,但Jenkins流水线在Docker容器里跑的时候,默认可能用的是jenkins用户(如果是官方Jenkins镜像的话),或者镜像里的其他非root用户。

你可以在流水线里加一步调试命令,看看当前用户和.ssh目录的情况:

whoami && ls -la ~/.ssh

对比手动执行时的输出,如果用户不一样,那你之前创建的.ssh目录是在root的家目录下,Jenkins用户根本访问不到。

解决办法:在脚本里明确指定Jenkins用户的家目录,并且修改权限归属:

# 假设Jenkins用户的家目录是/var/jenkins_home,根据实际情况调整
mkdir -p /var/jenkins_home/.ssh
touch /var/jenkins_home/.ssh/id_rsa
echo "-----BEGIN RSA PRIVATE KEY----- YOUR_KEY_CONTENTS_HERE -----END RSA PRIVATE KEY-----" > /var/jenkins_home/.ssh/id_rsa
chmod 600 /var/jenkins_home/.ssh/id_rsa
chown -R jenkins:jenkins /var/jenkins_home/.ssh

2. 提前处理SSH主机密钥验证

错误里的Permanently added the RSA host key...虽然只是警告,但有时候Jenkins执行时会因为首次连接的主机密钥确认逻辑(比如需要交互式确认)而间接导致拉取失败。

可以在SSH配置脚本里提前把Git服务器的主机密钥加入known_hosts:

# 以GitHub为例,其他服务器替换成对应的域名/IP
ssh-keyscan github.com >> /var/jenkins_home/.ssh/known_hosts
chmod 644 /var/jenkins_home/.ssh/known_hosts

如果只是临时调试,也可以在Git克隆命令里加参数跳过验证(不推荐生产环境):

git clone -o StrictHostKeyChecking=no git@github.com:your-username/your-repo.git

3. 确保SSH配置脚本在容器内部执行

如果你用的是Jenkins的Docker Agent,一定要确认你的SSH配置步骤是在容器内部运行的,而不是在Jenkins主机上。比如正确的流水线结构应该是这样的:

pipeline {
    agent {
        docker { image 'your-build-image:latest' } // 这里指定你的构建镜像
    }
    stages {
        stage('Setup SSH Credentials') {
            steps {
                sh '''
                    # 这段脚本是在容器内部执行的
                    mkdir -p ~/.ssh
                    echo "-----BEGIN RSA PRIVATE KEY----- YOUR_KEY_HERE -----END RSA PRIVATE KEY-----" > ~/.ssh/id_rsa
                    chmod 600 ~/.ssh/id_rsa
                    ssh-keyscan github.com >> ~/.ssh/known_hosts
                '''
            }
        }
        stage('Clone Migration Repo') {
            steps {
                sh 'git clone git@github.com:your-org/your-migration-repo.git'
            }
        }
    }
}

别把SSH配置脚本写到Jenkins主机的全局初始化脚本里,那样密钥是创建在主机上,容器完全访问不到。

4. 用Jenkins Credentials管理密钥(更规范安全的做法)

手动把密钥粘贴到脚本里不仅不安全,还容易因为换行、空格丢失导致密钥失效。推荐用Jenkins的Credentials插件来管理你的RSA私钥:

  1. 在Jenkins后台创建一个"SSH Username with private key"类型的凭证,把你的私钥粘贴进去,记下凭证ID;
  2. 在流水线里引用这个凭证,自动注入到容器里:
pipeline {
    agent { docker { image 'your-build-image:latest' } }
    environment {
        // 替换成你自己的凭证ID
        SSH_PRIVATE_KEY = credentials('jenkins-ssh-git-key')
    }
    stages {
        stage('Setup SSH') {
            steps {
                sh '''
                    mkdir -p ~/.ssh
                    echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
                    chmod 600 ~/.ssh/id_rsa
                    ssh-keyscan github.com >> ~/.ssh/known_hosts
                '''
            }
        }
        stage('Clone Repo') {
            steps {
                sh 'git clone git@github.com:your-org/your-migration-repo.git'
            }
        }
    }
}

这种方式既避免了明文密钥的安全风险,又能保证密钥的格式完全正确。


内容的提问来源于stack exchange,提问作者Happy Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:34:15