ECS服务 - 使用新的Docker镜像自动部署

时间:2015-07-17 21:32:04

标签: amazon-ecs

我想通过使用最新的Docker镜像启动ECS服务来自动部署我的应用程序。根据我的阅读,部署新映像版本的方法如下:

  1. 创建新的任务修订版(在更新Docker存储库上的图像之后)。
  2. 更新服务并指定新修订。
  3. 这似乎有效,但我想通过CLI完成所有操作,因此我可以编写脚本。 #2似乎很容易通过AWS CLI与update-service一起完成,但我没有看到做#1的方法而没有像register-task-definition一样重新指定整个任务JSON(我的JSON将在环境变量中包含凭据,因此我希望在尽可能少的地方使用它。

    这是我应该如何自动部署我的ECS服务更新吗?如果是这样,是否有一个好的"让任务定义启动一个新版本(即没有重复所有内容)的方法?

3 个答案:

答案 0 :(得分:16)

是的,这是正确的方法。

不,使用当前的API,您无法重复注册现有任务定义的新修订版。

如果您没有使用CLI生成原始任务定义(或者不想重用生成它的原始命令),您可以通过CLI尝试以下内容:

OLD_TASK_DEF=$(aws ecs describe-task-definition --task-definition <task_family_name>)
NEW_CONTAINER_DEFS=$(echo $OLD_TASK_DEF | jq '.taskDefinition.containerDefinitions' | jq '.[0].image="<new_image_name>"')
aws ecs register-task-definition --family <task_family_name> --container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"

不是100%安全,因为最后一个命令--container-defintions参数(包括"environment"条目)仍然可以通过ps等进程看到。其中一个AWS SDK可以让您更安心。

答案 1 :(得分:5)

Matt Callanan提供的答案对我不起作用:我在这部分收到错误:

--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"

导致:解析参数'--container-definitions'时出错:预期:'=',收到:'''表示输入:

'{environment:[{etc etc ....

我做的是解决它:

TASK_FAMILY=<task familiy name> 
DOCKER_IMAGE=<new_image_name>
LATEST_TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition ${TASK_FAMILY})

echo $LATEST_TASK_DEFINITION \
     | jq '{containerDefinitions: .taskDefinition.containerDefinitions, volumes: .taskDefinition.volumes}' \
     | jq '.containerDefinitions[0].image='\"${DOCKER_IMAGE}\" \
     > /tmp/tmp.json

aws ecs register-task-definition --family ${TASK_FAMILY} --cli-input-json file:///tmp/tmp.json

我从原始json文档中获取了containerDefinitions和volumes元素,因为我的containerDefinition使用了这些卷(所以如果不使用卷则不需要它。)

答案 2 :(得分:0)

#!/bin/bash
SERVICE_NAME="your service name"
IMAGE_VERSION="v_"${BUILD_NUMBER}
TASK_FAMILY="your task defination name"
CLUSTER="your cluster name"
REGION="your region"


echo "=====================Create a new task definition for this build==========================="
sed -e "s;%BUILD_NUMBER%;${BUILD_NUMBER};g" taskdef.json > ${TASK_FAMILY}-${IMAGE_VERSION}.json

echo "=================Resgistring the task defination==========================================="
aws ecs register-task-definition  --family ${TASK_FAMILY} --cli-input-json  file://${TASK_FAMILY}-${IMAGE_VERSION}.json --region ${REGION}

echo "================Update the service with the new task definition and desired count================"
TASK_REVISION=`aws ecs describe-task-definition --task-definition  ${TASK_FAMILY}  --region ${REGION} | egrep "revision" | tr "/" " " | awk '{print $2}' | sed 's/"$//'`


DESIRED_COUNT=`aws ecs describe-services --cluster ${CLUSTER} --services ${SERVICE_NAME}  --region ${REGION} | jq .services[].desiredCount`
if [ ${DESIRED_COUNT} = "0" ]; then
    DESIRED_COUNT="1"
fi

echo "===============Updating the service=============================================================="
aws ecs update-service --cluster ${CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${TASK_REVISION} --desired-count ${DESIRED_COUNT} --region ${REGION}


    enter code here