我有Jenkins服务器。我有Jenkins文件现在可以创建Docker映像,我想将该映像推送到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角色将如何工作?
答案 0 :(得分:2)
您现在可以使用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()
}
}
}
}
}
}
答案 1 :(得分:1)
我必须创建一个特殊的IAM用户并提供其访问权限吗? 秘密访问密钥?或做这件事的最好方法是什么。
如果您在AWS内运行Jenkins,并且使用密钥和访问密钥,则违反了最佳实践。您永远不要在AWS VPC内使用访问密钥和秘密密钥。它们旨在与AWS账户外部的AWS进行交互。
您应该创建一个具有特定角色的IAM role,并且该角色只允许Jenkins将图像推送到ECR。
就您当前的命令eval \$(aws ecr get-login --no-include-email --region us-east-2)
而言,您将始终需要此令牌来将图像推/拉到ECR,该令牌已到期,您应该在下面阅读有关此方法的信息。但是使用IAM角色似乎还可以。
您还可以探索Amazon+ECR-plugin
关于
Amazon ECR插件实现了一个Docker令牌生产者来转换Amazon 所有Docker相关的(大多数)使用的Jenkins API的凭据 插件。谢谢这个制作人,您可以选择您现有的 已注册的Amazon凭证用于各种Docker操作 Jenkins,使用CloudBees Docker Build和Publish插件的示例:
答案 2 :(得分:1)
我认为,没有一种简单的方法可以从本地服务器承担角色。如前所述,您将需要设置IAM用户并在本地应用程序上使用凭据。
答案 3 :(得分:0)
可能,但调试起来很微妙,因此请确保遵循以下步骤。
dockerfile
代理(您可以将其命名为Dockerfile.jenkins
或其他您喜欢的名称)并在其中安装amazon ecr credential helper,以得到干净稳定的 >建筑环境。FROM ubuntu:rolling
RUN apt-get update && apt-get install -y amazon-ecr-credential-helper
config.json
文件,例如.docker/config.json
。{
"credHelpers": {
"[YOUR_ACCOUNT_ID].dkr.ecr.[YOUR_REGION].amazonaws.com": "ecr-login"
}
}
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