我想通过使用最新的Docker镜像启动ECS服务来自动部署我的应用程序.根据我的阅读,部署新映像版本的方法如下:
这似乎有效,但我想通过CLI完成所有操作,因此我可以编写脚本.#2似乎很容易通过AWS CLI来完成update-service,但我没有看到做#1的方法而没有再次指定整个Task JSON register-task-definition(我的JSON将在环境变量中包含凭据,所以我想要在尽可能少的地方有这个.
这是我应该如何自动部署我的ECS服务更新?如果是这样,是否有一种"好"的方式让任务定义启动一个新版本(即没有重复所有内容)?
小智 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)'"
Run Code Online (Sandbox Code Playgroud)
不是100%安全,因为最后一个命令的--container-defintions参数(包括"environment"条目)仍然可以通过像这样的进程看到ps.其中一个AWS SDK可以让您更安心.
Matt Callanan提供的答案对我不起作用:我在这部分收到错误:
--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"
Run Code Online (Sandbox Code Playgroud)
导致:解析参数'--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
Run Code Online (Sandbox Code Playgroud)
我从原始json文档中获取了containerDefinitions和volumes元素,因为我的containerDefinition使用这些卷(因此如果不使用卷则不需要它).
| 归档时间: |
|
| 查看次数: |
3790 次 |
| 最近记录: |