`docker ps`의 출력에서 ​​매핑 된 포트를 추출하는 방법


16

이 명령으로 Docker 컨테이너에서 사용하는 모든 포트를 가져 오려고합니다.

sudo docker ps | tail -n1
29ba3137f3e2        java8/local:latest   "/bin/bash"         3 hours ago         Up 3 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp   DEMO-20151118124751

터미널에서 실행했을 때 원하는 것을 얻었습니다.

$ sudo docker ps | tail -n1 | awk '{print $12}'
0.0.0.0:32783->5432/tcp,

그러나 모든 매핑 된 포트가 필요합니다. 다음과 같은 쉘 스크립트를 만들 수 있습니까?

#!/bin/bash
paramnum=$(sudo docker ps | grep $lasttimestamp | wc -w);
text=$(sudo docker ps | tail -n1);
begin=($paramnum-4);
end=($paramnum-1);
for (( i=$end; i>=$begin; i--))
do
  t="awk '{print $"$i"}'";
  eval "echo $text | $t";
done

나는 몇 시간 동안 매달려 있었다. 다음과 같이 출력을 얻는 방법을 제안하거나 제안하십시오.

0.0.0.0:32782->10523/tcp
0.0.0.0:32783->5432/tcp,
0.0.0.0:8443->8443/tcp,
0.0.0.0:8080->8080/tcp,

답변:


3

펄 사용하기 :

sudo docker ps | \
tail -n 1 | \
perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
  • -l: 자동 라인 엔딩 처리를 활성화합니다. 두 가지 별도의 효과가 있습니다. 먼저, -n 또는 -p와 함께 사용하면 $ / (입력 레코드 구분 기호)가 자동으로 숨겨집니다. 둘째, $ \ (출력 레코드 구분 기호)가 octnum 값을 갖도록 지정하여 모든 print 문에 해당 구분 기호가 다시 추가되도록합니다. octnum을 생략하면 $ \를 현재 값 $ /로 설정합니다.
  • -a: -n 또는 -p와 함께 사용하면 자동 분리 모드를 켭니다. @F 배열에 대한 암시 적 분할 명령은 -n 또는 -p에 의해 생성 된 암시 적 while 루프 내에서 첫 번째로 수행됩니다.
  • -e: 한 줄의 프로그램을 입력하는 데 사용될 수 있습니다.
  • $,="\n": 출력 필드 구분 기호를 \n;
  • foreach(@F){/tcp,?$/&&push(@x,$_)}:의 각 요소에 대해 @F, 요소가 끝나고 tcp옵션 이 뒤에 오는 ,경우 끝에 요소를 추가합니다 @x.
  • print(@x): @x출력 필드 구분 기호 뒤에 각 요소를 인쇄합니다 .
% cat in
29ba3137f3e2        java8/local:latest   "/bin/bash"         3 hours ago         Up 3 hours          foo/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp   DEMO-20151118124751
29ba3137f3e2        java8/local:latest   "/bin/bash"         3 hours ago         Up 3 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp   DEMO-20151118124751
29ba3137f3e2        java8/local:latest   "/bin/bash"         3 hours ago         Up 3 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp   DEMO-20151118124751
% tail -n 1 in | perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
0.0.0.0:8080->8080/tcp,
0.0.0.0:8443->8443/tcp,
0.0.0.0:32783->5432/tcp,
0.0.0.0:32782->10523/tcp

나는 더 이상 Perl을 알지 못했지만 이것에 대해 정말 감사합니다. "docker ps"에서이 코드를 사용하는 방법
R.Chonpisit

@ R.Chonpisit 내가 쓴 첫 번째 줄은 터미널에서 복사하여 붙여 넣기를 의미하며 나머지는 그 기능에 대한 설명 일뿐입니다.sudo docker ps | perl -lane '$next=<>&&redo;$,="\n";foreach(@F){/tcp,?$/&&push(@list, $_)};print(@list);last'
kos

@ R.Chonpisit 이전 버전이 잘못되었습니다. 업데이트를 참조하십시오. 이것은 잘 작동합니다 :sudo docker ps | tail -n 1 | perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
kos

22

docker 맨 페이지에 따르면 이것을 시도 할 수 있습니다.

sudo docker ps --format "{{.Ports}}"

또는 ID가 필요한 경우 :

sudo docker ps --format "{{.ID}}: {{.Ports}}"

설명서에는 언급되어 있지 않지만 출력 형식을 지정하려면을 사용해야 {{}}합니다.

인용 man docker-ps:

   --format="TEMPLATE"
      Pretty-print containers using a Go template.
      Valid placeholders:
         .ID - Container ID
         .Image - Image ID
         .Command - Quoted command
         .CreatedAt - Time when the container was created.
         .RunningFor - Elapsed time since the container was started.
         .Ports - Exposed ports.
         .Status - Container status.
         .Size - Container disk size.
         .Labels - All labels asigned to the container.
         .Label - Value of a specific label for this container. For example .Label "com.docker.swarm.cpu"

도커 1.10.3

요즘에는 {{}}중괄호에 대한 몇 가지 유용한 참고 사항 이 있습니다 man docker-ps.

   --format="TEMPLATE"
      Pretty-print containers using a Go template.
      Valid placeholders:
         .ID - Container ID
         .Image - Image ID
         .Command - Quoted command
         .CreatedAt - Time when the container was created.
         .RunningFor - Elapsed time since the container was started.
         .Ports - Exposed ports.
         .Status - Container status.
         .Size - Container disk size.
         .Labels - All labels assigned to the container.
         .Label - Value of a specific label for this container. 
         For example {{.Label "com.docker.swarm.cpu"}}

Display containers with their commands
              # docker ps --format "{{.ID}}: {{.Command}}"
              a87ecb4f327c: /bin/sh -c #(nop) MA
              01946d9d34d8: /bin/sh -c #(nop) MA
              c1d3b0166030: /bin/sh -c yum -y up
              41d50ecd2f57: /bin/sh -c #(nop) MA

Display containers with their labels in a table
              # docker ps --format "table {{.ID}}\t{{.Labels}}"
              CONTAINER ID        LABELS
              a87ecb4f327c        com.docker.swarm.node=ubuntu,com.docker.swarm.storage=ssd
              01946d9d34d8
              c1d3b0166030        com.docker.swarm.node=debian,com.docker.swarm.cpu=6
              41d50ecd2f57        com.docker.swarm.node=fedora,com.docker.swarm.cpu=3,com.docker.swarm.storage=ssd

Display containers with their node label in a table
              # docker ps --format 'table {{.ID}}\t{{(.Label "com.docker.swarm.node")}}'
              CONTAINER ID        NODE
              a87ecb4f327c        ubuntu
              01946d9d34d8
              c1d3b0166030        debian
              41d50ecd2f57        fedora

1
hellingly 예
ETKI

2

awk필드 구분 기호와 함께 사용 {2,}. 왜 {2,}? 의 출력 ps둘 이상의 공백 을 열 사이의 분리 자로 사용합니다 . 즉, awk명령의 구분 기호로 사용할 수 있습니다 .

awk -F" {2,}" '{print $6}'

또는 당신의 ps명령

sudo docker ps | tail -n1 | awk -F" {2,}" '{print $6}'

또는없이 tail

sudo docker ps | awk -F" {2,}" 'END {print $6}'

샘플 출력

% <<<'29ba3137f3e2        java8/local:latest   "/bin/bash"         3 hours ago         Up 3 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp   DEMO-20151118124751' \
awk -F" {2,}" '{print $6}'
0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp

또는

% <<<'29ba3137f3e2        java8/local:latest   "/bin/bash"         3 hours ago         Up 3 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp   DEMO-20151118124751' \
    awk -F" {2,}" '{print $6}' |\
    tr ' ' '\n'
0.0.0.0:8080->8080/tcp,
0.0.0.0:8443->8443/tcp,
0.0.0.0:32783->5432/tcp,
0.0.0.0:32782->10523/tcp

이 방법으로 코드를 사용해보십시오. echo "29ba3137f3e2 java8 / local : latest / bin / bash 3 시간 전 Up 3 시간 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp , 0.0.0.0:32782->10523/tcp DEMO-20151118124751 "| awk -F "{2,}" '{print $ 6}'이지만 아무 것도 생성하지 않았습니다.
R.Chonpisit

물론, ps다른 출력이 있습니다.
AB

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.