So extrahieren Sie zugeordnete Ports aus der Ausgabe von `docker ps`

16

Ich versuche, alle von einem Docker-Container verwendeten Ports mit diesem Befehl abzurufen:

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

Als ich es im Terminal laufen ließ, bekam ich, was ich wollte.

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

Aber ich brauche alle zugeordneten Ports. Ist es möglich, ein Shell-Skript wie folgt zu erstellen:

#!/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

Ich habe ein paar Stunden rumgehangen. Bitte helfen Sie oder schlagen Sie vor, wie Sie eine Ausgabe wie unten erhalten.

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,
R.Chonpisit
quelle

Antworten:

3

Perl benutzen:

sudo docker ps | \
tail -n 1 | \
perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
  • -l: Aktiviert die automatische Verarbeitung des Zeilenendes. Es hat zwei separate Effekte. Zuerst wird automatisch $ / (das Trennzeichen für Eingabedatensätze) bei Verwendung von -n oder -p ausgewählt. Zweitens weist es $ \ (das Trennzeichen für Ausgabedatensätze) den Wert octnum zu, damit bei allen Druckanweisungen dieses Trennzeichen wieder hinzugefügt wird. Wenn octnum weggelassen wird, wird $ \ auf den aktuellen Wert von $ / gesetzt.
  • -a: Aktiviert den Autosplit-Modus bei Verwendung mit einem -n oder -p. Ein impliziter Split-Befehl für das @F-Array wird als erstes in der impliziten while-Schleife ausgeführt, die von -n oder -p erzeugt wird.
  • -e: kann verwendet werden, um eine Programmzeile einzugeben.
  • $,="\n": setzt das Ausgabefeld-Trennzeichen auf \n;
  • foreach(@F){/tcp,?$/&&push(@x,$_)}: für jedes Element von @F, wenn das Element mit tcpgefolgt von einem optionalen endet, ,fügt das Element am Ende von hinzu @x;
  • print(@x): druckt jedes Element aus, @xgefolgt vom Ausgabefeldtrennzeichen;
% 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
kos
quelle
Ich kenne Perl nicht mehr, aber ich schätze es sehr für Sie. Wie man diesen Code mit "docker ps" probiert.
R.Chonpisit
@ R.Chonpisit Die erste Zeile, die ich geschrieben habe, soll auf dem Terminal kopiert und eingefügt werden, der Rest ist nur eine Erklärung dessen, was es tut:sudo docker ps | perl -lane '$next=<>&&redo;$,="\n";foreach(@F){/tcp,?$/&&push(@list, $_)};print(@list);last'
kos
@ R.Chonpisit Die Vorgängerversion war falsch, siehe Update. Dies sollte gut funktionieren:sudo docker ps | tail -n 1 | perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
Kos
22

Den Docker-Manpages zufolge könnten Sie Folgendes versuchen:

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

oder wenn Sie auch einen Ausweis benötigen:

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

Es wird in der Dokumentation nicht erwähnt, aber um die Ausgabe zu formatieren, müssen Sie es verwenden {{}}.

Zitat aus 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"

Docker 1.10.3

Heutzutage gibt es ein paar nützliche Hinweise zu {{}}geschweiften Klammern in 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
c0rp
quelle
1
Hellingly ja
Etki
2

Verwendung awkmit dem Feldbegrenzer {2,}. Warum {2,}? Die Ausgabe von psverwendet mehr als ein Leerzeichen als Trennzeichen zwischen den Spalten. Das heißt, wir können dies als Trennzeichen für den awkBefehl verwenden.

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

oder für Ihren psBefehl

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

oder ohne tail

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

Beispielausgabe

% <<<'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

oder

% <<<'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
AB
quelle
Ich versuche Ihren Code auf diese Weise. echo "29ba3137f3e2 java8 / local: latest / bin / bash vor 3 Stunden Up 3 Stunden 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}', aber es wurde nichts produziert.
R.Chonpisit
Sicher nicht, pshat einen anderen Ausgang.
AB
1

Docker ps -q | xargs -n1 Docker-Port

Dai Phan
quelle