我的问题:
我希望在封装器(和ansible)构建的Amazon EC2注册表中将docker镜像保存为工件
我的限制: 构建需要由Bitbucket Pipelines触发。因此,构建步骤需要在Bitbucket管道本身或AWS EC2实例/容器中执行。
这是因为并非所有dev计算机都必须具有从其本地环境构建的权限/包。我只希望这些图像是由自动CI过程构建的。
我尝试了什么:
使用Packer,我可以远程构建AMI。我可以使用Packer构建Docker镜像(在本地构建并远程推送到Amazon ECR)。
然而,已经在docker容器中执行构建步骤的Bitbucket Pipeline无法访问docker守护进程'docker run'。
我在Bitbucket管道中收到的错误:
+ packer build ${BITBUCKET_CLONE_DIR}/build/pipelines_builder/template.json
docker output will be in this color.
==> docker: Creating a temporary directory for sharing data...
==> docker: Pulling Docker image: hashicorp/packer
docker: Using default tag: latest
docker: latest: Pulling from hashicorp/packer
docker: 88286f41530e: Pulling fs layer
...
...
docker: 08d16a84c1fe: Pull complete
docker: Digest: sha256:c093ddf4c346297598aaa13d3d12fe4e9d39267be51ae6e225c08af49ec67fc0
docker: Status: Downloaded newer image for hashicorp/packer:latest
==> docker: Starting docker container...
docker: Run command: docker run -v /root/.packer.d/tmp/packer-docker426823595:/packer-files -d -i -t hashicorp/packer /bin/bash
==> docker: Error running container: Docker exited with a non-zero exit status.
==> docker: Stderr: docker: Error response from daemon: authorization denied by plugin pipelines: Command not supported..
==> docker: See 'docker run --help'.
==> docker:
Build 'docker' errored: Error running container: Docker exited with a non-zero exit status.
Stderr: docker: Error response from daemon: authorization denied by plugin pipelines: Command not supported..
See 'docker run --help'.
==> Some builds didn't complete successfully and had errors:
--> docker: Error running container: Docker exited with a non-zero exit status.
Stderr: docker: Error response from daemon: authorization denied by plugin pipelines: Command not supported..
See 'docker run --help'.
==> Builds finished but no artifacts were created.
以下引用说明(取自link):
目前禁止使用其他命令,例如docker run 我们共享构建基础架构的安全原因。
所以,我知道为什么会发生以下情况。这是我面临的限制。我知道我需要找到一个替代方案。
可能的解决方案: 我现在能想到的唯一解决方案是使用安装了terraform和ansible的图像的Bitbucket Pipeline,包含以下内容:
ansible本地:
ansible-remote(对于上面提到的实例)
ansible本地
上述解决方案是否可行?还有替代品吗? Packer可以不在ECS中远程运行的容器中运行命令和提交吗?
我的长期解决方案是仅使用bitbucket管道来触发AWS中的lambda函数,这将在我们的EC2 Container Registry中启动容器并在那里执行构建。更多控制,我们可以让开发人员从他们的机器触发lambda函数(使用更多定制的动态变量)。
答案 0 :(得分:1)
我设置了一些可用于从任何CI工具执行的terraform脚本,但有一些先决条件:
这将在您选择的VPC中启动一个新的EC2实例并执行脚本。
对于此堆栈溢出问题,该脚本将包含一些用于构建和推送docker映像的打包程序命令。 EC2实例的AMI需要安装打包程序和docker。
在以下位置查找更多信息:https://github.com/dnk8n/remote-provisioner
答案 1 :(得分:0)
我对您的问题的理解是,bitbucket管道(通常称为agents
)没有足够的权限来执行您的AWS(terraform apply
,packer build
)帐户。
由于bitbucket管道代理程序在Bitbucket云中运行,而不是在您的AWS账户(您可以在其上分配IAM角色)中运行,因此您应该创建一个具有IAM角色的帐户(下面列出的策略和权限)分配其AWS API密钥(AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
和AWS_SESSION_TOKEN
的选项)作为管道中的环境变量。
您可以参考此文档,了解如何将您的AWS凭证添加到Bitbucket管道
https://confluence.atlassian.com/bitbucket/deploy-to-amazon-aws-875304040.html
通过它,您可以毫无问题地运行打包程序或terraform命令。
对于您需要分配以运行packer build
的最低政策,请参阅此文档:
https://www.packer.io/docs/builders/amazon.html#using-an-iam-task-or-instance-role
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action" : [
"ec2:AttachVolume",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CopyImage",
"ec2:CreateImage",
"ec2:CreateKeypair",
"ec2:CreateSecurityGroup",
"ec2:CreateSnapshot",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:DeleteKeypair",
"ec2:DeleteSecurityGroup",
"ec2:DeleteSnapshot",
"ec2:DeleteVolume",
"ec2:DeregisterImage",
"ec2:DescribeImageAttribute",
"ec2:DescribeImages",
"ec2:DescribeInstances",
"ec2:DescribeRegions",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSnapshots",
"ec2:DescribeSubnets",
"ec2:DescribeTags",
"ec2:DescribeVolumes",
"ec2:DetachVolume",
"ec2:GetPasswordData",
"ec2:ModifyImageAttribute",
"ec2:ModifyInstanceAttribute",
"ec2:ModifySnapshotAttribute",
"ec2:RegisterImage",
"ec2:RunInstances",
"ec2:StopInstances",
"ec2:TerminateInstances"
],
"Resource" : "*"
}]
}
对于terraform plan/apply
,您需要分配最多权限,因为terraform可以处理几乎所有aws资源。
其次,对于您现有的需求,您只需要运行packer和terraform命令,您不需要在bitbucket管道中运行docker命令。
因此,具有上述aws API环境的正常管道,它应该直接工作。
image: hashicorp/packer
pipelines:
default:
- step:
script:
- packer build <your_packer_json_file>
您也可以在图像hashicorp/terraform
中运行terraform命令。
答案 2 :(得分:0)
我想我会像这样接近它:
terraform apply
destroy
这样做可以将基础架构中的所有内容保存为代码,并且如果它们支持在任何时候运行docker run
,那么将Docker构建本地移动到BitBucket管道中会非常简单。