วิธีการแตกพอร์ตที่แมปจากเอาท์พุทของ `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

เมื่อฉันวิ่งใน terminal ฉันได้รับฉันต้องการ

$ 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

ใช้ Perl:

sudo docker ps | \
tail -n 1 | \
perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
  • -l: เปิดใช้งานการประมวลผลโดยอัตโนมัติ มันมีเอฟเฟกต์สองแบบแยกกัน ก่อนอื่นมันจะ chomps $ / (ตัวคั่นเร็กคอร์ดอินพุต) โดยอัตโนมัติเมื่อใช้กับ -n หรือ -p ประการที่สองมันกำหนด $ \ (ตัวคั่นเร็กคอร์ดเอาท์พุท) ให้มีค่าของ octnum เพื่อให้คำสั่งการพิมพ์ใด ๆ ที่จะมีตัวคั่นนั้นเพิ่มกลับมา หากไม่ระบุ octnum ให้ตั้งค่า $ \ เป็นค่าปัจจุบันของ $ /
  • -a: เปิดโหมด autosplit เมื่อใช้กับ -n หรือ -p คำสั่ง split โดยปริยายไปยังอาร์เรย์ @F นั้นทำขึ้นเป็นสิ่งแรกภายใน implicit ขณะที่ loop สร้างโดย -n หรือ -p
  • -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 อีกต่อไป แต่ฉันขอบคุณคุณมากสำหรับสิ่งนี้ วิธีลองรหัสนี้ด้วยใน "นักเทียบท่า 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

ตามหน้ามนุษย์เทียบท่าคุณสามารถลอง:

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: ล่าสุด / bin / bash 3 ชั่วโมงที่ผ่านมาขึ้น 3 ชั่วโมง , 0.0.0.0:32782->10523/tcp DEMO-20151118124751 "| awk -F "{2,}" '{พิมพ์ $ 6}' แต่ไม่ได้ผลอะไรเลย
R.Chonpisit

ไม่แน่ใจpsมีเอาต์พุตอื่น
AB

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.