컨테이너 이름 접두사별로 Docker 통계를 그룹화하는 방법은 무엇입니까?

컨테이너 이름 접두사별로 Docker 통계를 그룹화하는 방법은 무엇입니까?

docker stats --no-stream컨테이너 접두사별로 그룹화하고 RAM, CPU, 네트워크 및 IO의 합계를 표시하려면 어떻게 해야 합니까 ?

명령의 처음 두 열이 docker stats --no-stream다음과 같다고 생각하면:

CONTAINER ID   NAME
9b0ef23b9c11   CompanyOneDatabase
e8bd20985752   CompanyOneAdminer
0931f3ece839   CompanyOneSite
ecbf58f6373c   CompanyOneApi
61a5c5853061   CopmanyTwoDatabase
545f6f7d6f03   CopmanyTwoAdminer
28c026a8b048   CopmanyTwoSite
358a1791c233   CopmanyTwoApi
e31c842b7a35   CopmanyTwoAdminPanel
e31c842b7a35   CopmanyTwoAdminApi

이 결과를 어떻게 얻을 수 있습니까?

CompanyOne RAM_SUM CPU_SUM Network_SUM IO_SUM
CopmanyTwo RAM_SUM CPU_SUM Network_SUM IO_SUM

~에서이 문제그리고이 스크립트를 생각해 냈지만 작동하지 않습니다.

#!/bin/bash

docker stats --no-stream | awk '/CompanyOne/  {print $3, $4, $8, $11}' | xargs awk '{
    for (i=2; i<=NF; i++) {
        sumcols[i]+= $i; sumrows+= $i 
    }; print $0, sumrows
}
END { for (x in sumcols)
         { printf SEP sumcols[x]; SEP=FS };
     print ""
}' infile

기본적으로 쉘에서 매핑/축소를 수행해야 합니다. 어떻게 구현할 수 있나요?

고쳐 쓰다: 이것은 VPS 인스턴스 중 하나의 실제 샘플입니다. 개인정보 보호를 위해 회사 이름은 다음 문자로 대체되었습니다.

https://textuploader.com/tdftd

답변1

나는 그것을 알아

count.awk:

NF == 1 {
   ram[$1] = cpu[$1] = network[$1] = io[$1] = 0 ;
}
NF > 1 {
   for (r in ram ) 
       if (substr($2,1,length(r)) == r ) {
          ram[r]+=$3 ; cpu[r]+=$4 ; network[r] += $8 ; io[r] += $11 ;
   }
}
END { for (r in ram )
       printf "%-25s %6.2f %6d %6d %6d\n",r,ram[r],cpu[r],network[r],io[r] ; 
    }

회사 목록이 필요합니다(샘플에 있음).

Aaaaaaaa
Bbbbbbbbbbb
Cccccccccc
Ddddddddddd

라고

docker stats --no-stream | awk -f count.awk l -

이것은

Bbbbbbbbbbb                 0.25   1071   1235    360
Aaaaaaaa                    0.27   1118   2674    382
Ddddddddddd                 0.23   1372   3310    432
Cccccccccc                  0.24   1183   2388   1302
  • 형식 문자열("%-25s %6d %6d %6d %6d\n")을 조정하여 더 많거나 적은 공간을 제공할 수 있습니다.
  • 각 회사가 항상 동일한 컨테이너 재고를 보유한다면 수동 재고를 피할 수 있습니다.
  • 주석에서 지적했듯이 docker stats형식 문자열( )을 제공하면 --format=" "필수 필드만 인쇄됩니다.
  • 지역에 따라 awk로 전화해야 할 수도 있습니다.LC_NUMERIC=C awk -f ...

관련 정보