`Docker ps` के आउटपुट से मैप किए गए पोर्ट कैसे निकालें


16

मैं इस आदेश के साथ एक डॉक कंटेनर द्वारा उपयोग किए जाने वाले सभी बंदरगाहों को प्राप्त करने की कोशिश कर रहा हूं:

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 के साथ प्रयोग किया जाता है। दूसरा, यह ऑक्टनम का मूल्य रखने के लिए $ \ (आउटपुट रिकॉर्ड सेपरेटर) प्रदान करता है ताकि किसी भी प्रिंट स्टेटमेंट में उस विभाजक को वापस जोड़ा जा सके। यदि ऑक्टनम को छोड़ दिया जाता है, तो $ / को $ / के मौजूदा मूल्य पर सेट किया जाता है।
  • -a: एक -n या -p के साथ उपयोग किए जाने पर ऑटोसप्लिट मोड को चालू करता है। @F सरणी के लिए एक अंतर्निहित विभाजन कमांड को -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

मैं न तो पर्ल के बारे में जानता हूं और न ही वास्तव में इसके लिए आपकी सराहना करता हूं। इस कोड को "docker ps" में कैसे आज़माएं।
R.Conpisit

@ 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)'
कोस

22

डोकर मैन पेजों के अनुसार आप यह कोशिश कर सकते हैं:

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

या अगर आपको आईडी की आवश्यकता है:

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

मैं इस तरह से आपके कोड की कोशिश करता हूं। इको "29ba3137f3e2 java8 / स्थानीय: नवीनतम / बिन / बाश 3 घंटे पहले 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,}" "{प्रिंट $ 6} 'लेकिन इसने कुछ भी नहीं बनाया।
R.Conpisit

निश्चित नहीं, psएक और आउटपुट है।
AB

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.