如何正确地将 ssh 密钥文件从 Jenkins 凭据变量传递到 docker build 命令?

a k*_*a k 8 credentials jenkins docker devops jenkins-docker

这个问题是这个问题How to pass jenkins凭据到docker build命令的后续问题 ?

我从 groovy 管道中的 jenkins 凭证存储获取 ssh 密钥文件,并通过 --build-arg 将其传递到 docker build 命令,以便我可以从 docker 容器内的私有 git 存储库中签出和构建工件

凭证存储 id :cicd-user,用于按照我的常规 Jenkinsfile 的预期检查我的私人作品

checkout([$class: 'GitSCM',
            userRemoteConfigs: [[credentialsId: 'cicd-user', url:'ssh://git@bitbucket.myorg.co:7999/A/software.git']]
Run Code Online (Sandbox Code Playgroud)

我访问它并尝试将其传递给 docker build 命令:

  withCredentials([sshUserPrivateKey(credentialsId: 'cicd-user', keyFileVariable: 'FILE')]) { 
           sh "cd ${WORKSPACE} && docker build -t ${some-name} --build-arg USERNAME=cicd-user --build-arg  PRIV_KEY_FILE=\$FILE --network=host -f software/tools/jenkins/${some-name}/Dockerfile ."
        }
Run Code Online (Sandbox Code Playgroud)

在 Dockerfile 中我做

RUN echo "$PRIV_KEY_FILE" > /home/"$USERNAME"/.ssh/id_rsa && \
 chmod 700 /home/"$USERNAME"/.ssh/id_rsa 
Run Code Online (Sandbox Code Playgroud)

RUN echo "Host bitbucket.myorg.co\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config

但我看到以下问题

“加载密钥“/home/cicd-user/.ssh/id_rsa”:(格式无效)“git@Bitbucket.mycomp.co:权限被拒绝(公钥)“致命:无法从远程存储库读取”

过去,我通过像下面这样的 cat'ing 从外部将 ssh priv 密钥作为 --build-arg 传递

--build-arg ssh_prv_key="$(cat ~/.ssh/id_rsa)"

我应该做类似的事情吗

--build-arg PRIV_KEY_FILE="$(cat $FILE)"

知道可能出了什么问题或者我应该在哪里寻找正确的调试方法吗?

msg*_*45f 8

我昨天遇到了同样的问题,我想我已经找到了一个可行的解决方案。

以下是我采取的基本步骤 - 使用sshagent 插件在 Jenkins 作业中管理 sshagent。您也可以使用 withCredentials ,尽管这不是我最终取得成功的原因。

可以使用命令 --ssh 标志将 ssagent (或者密钥)提供给特定的构建步骤docker build(功能参考)需要注意的是,要使其工作(在当前时间),您需要设置 DOCKER_BUILDKIT=1。如果您忘记这样做,那么它似乎会忽略此配置,并且 ssh 连接将会失败。设置完成后,sshagent

截下来看看管道:

pipeline {
    agent {
        // ...
    }
    environment {
        // Necessary to enable Docker buildkit features such as --ssh
        DOCKER_BUILDKIT = "1"
    }
    stages {
        // other stages

        stage('Docker Build') {
            steps {
                // Start ssh agent and add the private key(s) that will be needed in docker build
                sshagent(['credentials-id-of-private-key']) {
                    // Make the default ssh agent (the one configured above) accessible in the build
                    sh 'docker build --ssh default .'
                }
            }
        // other stages
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Dockerfile 中,有必要明确指定需要访问 ssh 代理的行。mount=type=ssh这可以通过包含在相关的 RUN 命令中来完成。

对我来说,这看起来大致是这样的:

FROM node:14
# Retrieve bitbucket host key
RUN mkdir -p -m -0600 ~/.ssh && ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts
...
# Mount ssh agent for install
RUN --mount=type=ssh npm i
...
Run Code Online (Sandbox Code Playgroud)

通过此配置,npm install 能够通过 sshagent 使用 docker build 中的 SSH 私钥来安装存储在 Bitbucket 上的私有 git 存储库。