2017-02-22 56 views
0

我正在使用Docker Swarm 1.13.1,按名稱(A-Z)列出服務將非常實用。如何按名稱排序`docker service ls`

我不認爲Docker本地支持這個壯舉,所以我期望一些awk,排序和其他一些小黑客。

到目前爲止,這是最接近我可以得到:

[email protected]:~/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 

或...

[email protected]:~/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個命令:

[email protected]:~/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 

提前感謝!

+1

井的另一個例子,你有什麼嘗試到目前爲止? – hek2mgl

+0

嗨帕斯卡爾,我看到你已經有Portainer在運行,爲什麼不直接在UI中對它們進行排序? :) – Tony

+0

我在終端發展,我從終端啓動一切。但是對於其他用戶來說,Portainer仍然很棒:) –

回答

0

可以使用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] 
    } 
}' 

結果根據排序key陣列的其中包含耦合[name]\t[index]順序打印。該索引用於獲取要打印的行。

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 pos噸爲ASORT