7

我有 Jenkins 服务器本地。我有创建 Docker 映像的 Jenkins 文件,现在我想将该映像推送到 AWS ECR。我必须创建一个特殊的 IAM 用户并提供其访问和秘密访问密钥吗?或者什么是最好的方法来做到这一点。

我在网上找到了下面

  withAWS(role:'Jenkins', roleAccount:'XXXX216610',duration: 900, roleSessionName: 'jenkinssession')
  sh ' eval \$(aws ecr get-login --no-include-email --region us-east-2) '

但是由于我的 jenkins 服务器是 onprem,角色将如何工作?

4

4 回答 4

8

我是否必须创建一个特殊的 IAM 用户并提供其访问和秘密访问密钥?或者什么是最好的方法来做到这一点。

如果您在 AWS 中运行 Jenkins 并且使用密钥和访问密钥,则您违反了最佳实践。您绝不应该在 AWS VPC 中使用访问密钥和秘密密钥。这些旨在从 AWS 账户外部与 AWS 交互。

您应该创建一个具有特定角色的IAM 角色,并且该角色只允许 Jenkins 将图像推送到 ECR。

就您当前的命令而言,eval \$(aws ecr get-login --no-include-email --region us-east-2)您将始终需要此令牌将图像推/拉到 ECR,此令牌有一定期限,您应该在下面阅读有关此方法的信息。但 IAM 角色似乎没问题。

ECR_AWSCLI-获取登录令牌

您也可以探索Amazon+ECR-plugin

关于

Amazon ECR 插件实现了一个 Docker 令牌生成器,以将 Amazon 凭证转换为(大部分)所有 Docker 相关插件使用的 Jenkins 的 API。感谢这位制作人,您可以为 Jenkins 中的各种 Docker 操作选择您现有的已注册 Amazon 凭证,以使用 CloudBees Docker Build and Publish 插件进行示例:

于 2019-11-28T10:05:20.563 回答
8

您现在可以使用https://plugins.jenkins.io/amazon-ecr/中的 Jenkins 'amazon-ecr' 插件代替 eval进行 ECR 部署。

pipeline {
  environment {
    registry = '1111111111111.dkr.ecr.eu-central-1.amazonaws.com/myRepo'
    registryCredential = 'ID_OF_MY_AWS_JENKINS_CREDENTIAL'
    dockerImage = ''
  }
  agent any
  stages {
    stage('Building image') {
      steps{
        script {
          dockerImage = docker.build registry + ":$BUILD_NUMBER"
        }
      }
    }
    stage('Deploy image') {
        steps{
            script{
                docker.withRegistry("https://" + registry, "ecr:eu-central-1:" + registryCredential) {
                    dockerImage.push()
                }
            }
        }
    }
  }
}
于 2020-06-30T21:50:19.570 回答
4

这是可能的,但调试起来非常微妙,因此请确保遵循以下步骤。

  1. dockerfile在 jenkins 管道中使用代理(您可以命名它Dockerfile.jenkins或您喜欢的其他名称)并在其中安装amazon ecr credential helper以获得干净稳定的构建环境。
FROM ubuntu:rolling

RUN apt-get update && apt-get install -y amazon-ecr-credential-helper
  1. config.json在您的 git 存储库中创建一个文件,例如.docker/config.json.
{
    "credHelpers": {
        "[YOUR_ACCOUNT_ID].dkr.ecr.[YOUR_REGION].amazonaws.com": "ecr-login"
    }
}
  1. docker pull在您的中进行测试Jenkinsfile,确保您的访问密钥的用户启用了正确的策略(可能AmazonEC2ContainerRegistryFullAccess)。
pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkins'
        }
    }
    stages {
        stage('TEST ECR') {
            steps {
                script { 
                    sh "DOCKER_CONFIG=.docker AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY_ID] AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_KEY] docker pull [YOUR PRIVATE IMAGE]"

                    // docker.build("${tag}", "${DOCKER_BUILD_ARGS} -f Dockerfile .")
                    // sh "docker push ${tag}"
                }
            }
        }
    }
}

如果可以拉,那么您可以更改DOCKER_CONFIG=.docker AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY_ID] AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_KEY] docker pull [YOUR PRIVATE IMAGE]docker push [YOUR IMAGE]正确的环境变量设置。

你的回购似乎:

.
├── .docker
│   └── config.json
├── Dockerfile
└── Dockerfile.jenkins
于 2020-04-16T02:19:24.110 回答
0

我认为没有一种简单的方法可以从本地服务器承担角色。正如您所提到的,您将需要设置一个 IAM 用户并在您的本地应用程序上使用凭证。

于 2019-11-28T10:09:07.897 回答