我正在使用 AWS Code Pipeline、Code Build 创建一个新的 Docker 容器并将其推送到 ECR。
我的应用程序是一个简单直接的基于单个容器的应用程序。有什么方法可以减少当前运行的容器并从 ECS 注册表中重新启动一个新容器(通过代码管道生成代码的输出)。
我尝试了使用 EC2 用户数据的 CloudFormation,一侧是自定义脚本,另一侧是使用 ECS 和任务定义的 CloudFormation(尚未成功)。我强烈认为必须有更明显和更简单的方法。
我正在使用 AWS Code Pipeline、Code Build 创建一个新的 Docker 容器并将其推送到 ECR。
我的应用程序是一个简单直接的基于单个容器的应用程序。有什么方法可以减少当前运行的容器并从 ECS 注册表中重新启动一个新容器(通过代码管道生成代码的输出)。
我尝试了使用 EC2 用户数据的 CloudFormation,一侧是自定义脚本,另一侧是使用 ECS 和任务定义的 CloudFormation(尚未成功)。我强烈认为必须有更明显和更简单的方法。
你检查aws ecs
过命令行工具吗?它允许编写一个简单的 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 $2}' | 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