【问题标题】:How to sort by name `docker service ls`如何按名称排序`docker service ls`
【发布时间】:2017-02-22 18:30:51
【问题描述】:

我使用的是 Docker Swarm 1.13.1,按名称 (A-Z) 列出服务非常实用。

我认为 Docker 本身并不支持这一壮举,所以我期待一些 awk、sort 和其他小技巧。

到目前为止,这是我能得到的最接近的:

root@N01-par1-dev-e:~/deploy-setup# docker service ls | sort -k2,2 -k1
yru8n6zxmp08  consul            global      4/4       consul:latest
1lb98n83fttr  mysql             replicated  1/1       devmtl/percona-fire:5.7.16-10-1
ID            NAME              MODE        REPLICAS  IMAGE
i75t4zef8x8c  papertrail        global      4/4       gliderlabs/logspout:latest
4s14t7f13fp8  portainer         replicated  1/1       portainer/portainer:1.11.3
8wojufyq3dwn  resilio           global      4/4       devmtl/resilio-fire:2.4.4-alpine-0
vn8fhhfvb6pw  sematext          global      4/4       sematext/sematext-agent-docker:1.31.11
mwxtlff6jyl5  thm-s0001-iamfoo  replicated  1/1       devmtl/iam-this-ctn:1.0.1-alpine-0
o8p4q85axkwy  thm-s0002-iambar  replicated  1/1       devmtl/iam-this-ctn:1.0.1-alpine-0
wedrfqzkg3zp  thm-s0003-caply   replicated  1/1       devmtl/nginx-fire:1.10.3-alpine-0
ql9yapc0brnk  thm-s0003-valgo   replicated  1/1       devmtl/caddy:0.9.5-alpine-0
vu3jhyo71oos  traefik           replicated  1/1       traefik:v1.1.2-alpine

或者...

root@N01-par1-dev-e:~/deploy-setup# docker service ls | tail -n +2 |  sort -k2,2 -k1
yru8n6zxmp08  consul            global      4/4       consul:latest
1lb98n83fttr  mysql             replicated  1/1       devmtl/percona-fire:5.7.16-10-1
i75t4zef8x8c  papertrail        global      4/4       gliderlabs/logspout:latest
4s14t7f13fp8  portainer         replicated  1/1       portainer/portainer:1.11.3
8wojufyq3dwn  resilio           global      4/4       devmtl/resilio-fire:2.4.4-alpine-0
vn8fhhfvb6pw  sematext          global      4/4       sematext/sematext-agent-docker:1.31.11
mwxtlff6jyl5  thm-s0001-iamfoo  replicated  1/1       devmtl/iam-this-ctn:1.0.1-alpine-0
o8p4q85axkwy  thm-s0002-iambar  replicated  1/1       devmtl/iam-this-ctn:1.0.1-alpine-0
wedrfqzkg3zp  thm-s0003-caply   replicated  1/1       devmtl/nginx-fire:1.10.3-alpine-0
ql9yapc0brnk  thm-s0003-valgo   replicated  1/1       devmtl/caddy:0.9.5-alpine-0
vu3jhyo71oos  traefik           replicated  1/1       traefik:v1.1.2-alpine

或者使用 2 个命令:

root@N01-par1-dev-e:~/deploy-setup# echo; \
> docker service ls | head -n 1; \
> docker service ls | tail -n +2 |  sort -k2,2 -k1; echo;

ID            NAME              MODE        REPLICAS  IMAGE
yru8n6zxmp08  consul            global      4/4       consul:latest
1lb98n83fttr  mysql             replicated  1/1       devmtl/percona-fire:5.7.16-10-1
i75t4zef8x8c  papertrail        global      4/4       gliderlabs/logspout:latest
4s14t7f13fp8  portainer         replicated  1/1       portainer/portainer:1.11.3
8wojufyq3dwn  resilio           global      4/4       devmtl/resilio-fire:2.4.4-alpine-0
vn8fhhfvb6pw  sematext          global      4/4       sematext/sematext-agent-docker:1.31.11
mwxtlff6jyl5  thm-s0001-iamfoo  replicated  1/1       devmtl/iam-this-ctn:1.0.1-alpine-0
o8p4q85axkwy  thm-s0002-iambar  replicated  1/1       devmtl/iam-this-ctn:1.0.1-alpine-0
wedrfqzkg3zp  thm-s0003-caply   replicated  1/1       devmtl/nginx-fire:1.10.3-alpine-0
ql9yapc0brnk  thm-s0003-valgo   replicated  1/1       devmtl/caddy:0.9.5-alpine-0
vu3jhyo71oos  traefik           replicated  1/1       traefik:v1.1.2-alpine

提前致谢!

【问题讨论】:

  • 嗯,到目前为止你尝试了什么?
  • 嗨 Pascal,我看到你已经运行了 Portainer,为什么不直接在 UI 中对它们进行排序呢? :)
  • 我在终端中开发并从终端启动所有内容。但是是的,Portainer 对其他用户来说仍然很棒:)

标签: bash docker


【解决方案1】:

您可以使用awkNAME 列中提取名称,并对生成的名称数组进行排序,以按照此顺序打印行:

对于docker service ls,存储namesmode 的位置以作为名称的子串。然后使用asort 处理键数组(包含名称)的排序:

docker service ls | awk ' 
{
    if (NR == 1) {
        print $0
        names=index($0,"NAME")
        mode=index($0,"MODE")
    }
    else{
        key[NR-2]=substr($0,names,mode-1-names) "\t" NR
        value[NR-2]=$0
    }
}
END {
    asort(key)
    for (i=1; i<=(NR-1); i++) {
        split(key[i],a,"\t")
        print value[a[2]-2]
    }
}'

根据包含[name]\t[index]key 数组的排序顺序打印结果。索引用于获取要打印的行。

docker ps -a 的情况下,NAMES 是最后一列,所以我们在这里为长度取一个固定值100

docker ps -a | awk ' 
{
    if (NR == 1) {
        print $0
        names=index($0,"NAME")
    }
    else{
        key[NR-2]=substr($0, names, 100) "\t" NR
        value[NR-2]=$0
    }
}
END {
    asort(key)
    for (i=1; i<=(NR-1); i++) {
        split(key[i],a,"\t")
        print value[a[2]-2]
    }
}'

查看this post 获取另一个分类示例

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2018-11-28
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多