【问题标题】:Jenkins Pipeline - connect to Docker host using SSH credentialsJenkins Pipeline - 使用 SSH 凭据连接到 Docker 主机
【发布时间】:2021-11-07 07:30:25
【问题描述】:

我们希望使用 Jenkins Pipelines 在安装了 Docker 但不会(也不会)通过端口 2376 公开 Docker 套接字的远程主机上使用 AWS ECR 映像。

几个更简单的选项包括:

  1. 使用现有的 Jenkins SSH/脚本
  2. 使用管道 ssh-agent 并在其中内联运行命令

但是,由于声明式 docker 插件似乎拥有所需的一切,因此使用它会更干净,因为标签等都将与管道的其他部分对齐。

互联网上的所有例子展示

docker.withServer("tcp://X:2376","credentialsId") {...} 

但是,从配置 Jenkins Cloud Config -> Docker Templates 开始,似乎提供了 ssh,所以我们尝试了以下操作:

stages {
    stage('Deploy to Remote Host') {
        steps {
            script {
                docker.withServer("ssh://ec2-x-x-x-x.mars-1.compute.amazonaws.com:22", "ssh-credentials-id") {
                    docker.withRegistry("https://1234567890.dkr.ecr.mars-1.amazonaws.com", "ecr:mars-1:ecr-credentials-id") {
                         docker.pull('my-image:latest')
                    }
                }    
            }
        }
    }
}

不幸的是,我们收到以下连接错误:

error during connect: Post http://docker/v1.40/auth: command [ssh -p 22 ec2-x-x-x-x.mars-1.compute.amazonaws.com -- docker system dial-stdio] has exited with exit status 255, please make sure the URL is valid, and Docker 18.09 or later is installed on the remote host: stderr=Host key verification failed.

我们在服务器上有 Docker v19,使用 ssh-agent 的 ssh 密钥就可以了。

关于我们需要做些什么来使其正常工作有什么想法吗?

【问题讨论】:

  • 有什么问题 - 在容器内运行管道或连接到 ecr?
  • 通过 ssh 连接到(远程)EC2 实例以运行“docker stop”、docker pull 和“docker run”命令(即部署应用程序更新)。

标签: docker jenkins jenkins-pipeline pipeline cloudbees


【解决方案1】:

我通过将 SSH 命令(在代理上调用)添加到远程/目标主机,然后使用 shell 调用 'docker pull...'、'docker run...' 等解决了这个问题......但是正在做这在 Jenkins Pipeline 中是脆弱的 - ssh 命令变成了脚本,凭据查找相当复杂且看起来很混乱,总体结果虽然在 Blue Ocean 中呈现了一个不错的管道,但将变得难以编码/维护。

因此,按照“在 Jenkins Pipeline 中执行所有操作都是反模式”的建议,我将流程分为两部分 - 使用 Jenkins Pipeline + Docker Plugin 构建/推送映像,该插件已被记录并作为头等关注点提供支持,然后从管道中调用 Ansible 的“构建作业”,传递 dev/stage/live 参数,并让 Ansible 处理所需的所有其他变量和机密。这意味着最终结果在 Blue Ocean 中是相似的,但是复杂的部署逻辑在设计用于处理我的用例的适当工具中更清晰地编码,并且在 Ansible 中循环通过环境/主机要干净得多 [或替换您首选的部署工具在这里]。

【讨论】:

    【解决方案2】:

    为了摆脱“主机密钥验证失败”错误,我在管道中使用了这个:

    sh '''
    [ -d ~/.ssh ] || mkdir ~/.ssh && chmod 0700 ~/.ssh && ssh-keyscan HOSTNAME >> ~/.ssh/known_hosts
    '''
    

    【讨论】:

      猜你喜欢
      • 2020-02-17
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 2020-10-20
      • 2023-01-30
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多