ECS 服务 - 使用新的 Docker 映像自动部署
ECS Service - Automating deploy with new Docker image
我想通过使用最新的 Docker 映像启动我的 ECS 服务来自动部署我的应用程序。据我了解,部署新映像版本的方法如下:
- 创建一个新的任务修订版(在更新您的 Docker 存储库中的图像之后)。
- 更新服务并指定新版本。
这似乎可行,但我想通过 CLI 完成所有操作,以便编写脚本。 #2 似乎很容易通过 AWS CLI 使用 update-service
完成,但我没有看到没有像 register-task-definition
一样重新指定整个任务 JSON 的方法来完成 #1 (我的 JSON 将在环境变量中包含凭据,所以我希望在尽可能少的地方使用它)。
这是我自动部署 ECS 服务更新的方式吗?如果是这样,是否有 "good" 方法让任务定义启动新修订版(即不复制所有内容)?
是的,这是正确的做法。
不,对于当前的 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 之一会让您更加安心。
Matt Callanan 提供的答案对我不起作用:我收到这部分的错误:
--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"
结果:解析参数“--container-definitions”时出错:预期:“=”,收到:“”用于输入:
'{ 环境:[ { 等等......
我解决它的方法是:
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 使用了这些卷(如果您不使用卷,则不需要)。
#!/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 }' | 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
我想通过使用最新的 Docker 映像启动我的 ECS 服务来自动部署我的应用程序。据我了解,部署新映像版本的方法如下:
- 创建一个新的任务修订版(在更新您的 Docker 存储库中的图像之后)。
- 更新服务并指定新版本。
这似乎可行,但我想通过 CLI 完成所有操作,以便编写脚本。 #2 似乎很容易通过 AWS CLI 使用 update-service
完成,但我没有看到没有像 register-task-definition
一样重新指定整个任务 JSON 的方法来完成 #1 (我的 JSON 将在环境变量中包含凭据,所以我希望在尽可能少的地方使用它)。
这是我自动部署 ECS 服务更新的方式吗?如果是这样,是否有 "good" 方法让任务定义启动新修订版(即不复制所有内容)?
是的,这是正确的做法。
不,对于当前的 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 之一会让您更加安心。
Matt Callanan 提供的答案对我不起作用:我收到这部分的错误:
--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"
结果:解析参数“--container-definitions”时出错:预期:“=”,收到:“”用于输入:
'{ 环境:[ { 等等......
我解决它的方法是:
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 使用了这些卷(如果您不使用卷,则不需要)。
#!/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 }' | 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