如何在ECS describe-tasks查询中仅获取主容器及运行任务镜像信息
解决ECS任务主容器镜像获取问题
核心思路
不用依赖容器的随机顺序,而是通过过滤特定容器或者固定排序规则来定位主容器,以下是具体实现方式:
1. 过滤排除Sidecar容器(推荐)
根据Sidecar容器的名称特征(比如常见的istio-proxy、envoy、aws-xray-daemon),直接在查询中排除它们,只保留主容器:
aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks $ARNS \ --profile $PROFILE --output table \ --query "tasks[] | [].[startedAt, containers[?!contains(name, 'istio-proxy') && !contains(name, 'envoy')].image | [0]]"
- 把
'istio-proxy'、'envoy'换成你环境里的Sidecar容器名称即可 - 逻辑是:排除名称包含指定关键词的容器,取剩下的第一个容器镜像
如果你的主容器有特定名称标识(比如包含main、app),也可以反过来匹配:
aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks $ARNS \ --profile $PROFILE --output table \ --query "tasks[] | [].[startedAt, containers[?contains(name, 'main')].image | [0]]"
2. 基于essential属性过滤
如果你的主容器在任务定义中被标记为essential: true(且是唯一的),可以通过这个属性过滤:
aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks $ARNS \ --profile $PROFILE --output table \ --query "tasks[] | [].[startedAt, containers[?essential == `true`].image | [0]]"
3. 按固定规则排序容器
如果一定要依赖顺序,用sort_by函数按容器名称/启动时间等规则排序,再取指定位置的容器:
# 按容器名称升序排序,取第一个 aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks $ARNS \ --profile $PROFILE --output table \ --query "tasks[] | [].[startedAt, sort_by(containers, &name)[0].image]" # 按容器启动时间降序排序,取第一个(通常主容器先启动) aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks $ARNS \ --profile $PROFILE --output table \ --query "tasks[] | [].[startedAt, sort_by(containers, &startedAt)[-1].image]"
4. 合并两步操作(简化命令)
可以把提取ARNs和描述任务合并成一条命令,减少变量传递:
aws ecs describe-tasks --cluster $CLUSTER_NAME \ --tasks $(aws ecs list-tasks --cluster $CLUSTER_NAME --desired-status 'RUNNING' --query 'taskArns' --output text --profile $PROFILE) \ --profile $PROFILE --output table \ --query "tasks[] | [].[startedAt, containers[?!contains(name, 'istio-proxy')].image | [0]]"
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

