aws 中 docker 的简单持续交付程序

Simple Continuous Deliver procedure for docker in aws

我正在使用 AWS Code Pipeline、Code Build 创建一个新的 Docker 容器并将其推送到 ECR。

我的应用程序是一个简单直接的基于单个容器的应用程序。什么是减少当前 运行 容器并从 ECS 注册表(代码构建通过代码管道的输出)重新启动新容器的摩擦较小的方法。

我尝试了使用 EC2 用户数据的 CloudFormation,一方面是自定义脚本,另一方面是使用 ECS 和任务定义的 CloudFormation(尚未成功)。我强烈认为必须有更明显和更简单的方法。

你检查过aws ecs command-line tool了吗?它允许编写一个简单的 bash 脚本来更新任务和服务:

cluster='<cluster-id>'
service='<service-id>'
project='<project-name>'
elb='<ELB-id>'

version=$(git rev-parse --short=12 HEAD)

sed "s#{image}#${repo}:app-${version}#g" ./docker-compose.yml | sed "s#{frontend}#${repo}:frontend-${version}#g" | sed "s#{logger}#${repo}:logger-${version}#g"> /tmp/docker-compose.yml
ecs-cli compose --file /tmp/docker-compose.yml --project-name ${project} create

taskDefinition=$(aws ecs list-task-definitions --family-prefix "ecscompose-${project}" --output text --sort DESC | awk '{print }' | head -n 1)

if [[ $(aws ecs list-services --cluster "${cluster}" --output text) =~ ${service} ]]; then
    aws ecs update-service --cluster "${cluster}"  --service ${service} --task-definition "$taskDefinition" >> /dev/null
else
    aws ecs create-service --cluster "${cluster}" --service ${service} --task-definition "$taskDefinition" --load-balancers loadBalancerName=${elb},containerName=nginx,containerPort=80 --desired-count 5 --role arn:aws:iam::395910257915:role/ecsServiceRole
fi