Come estrarre le porte mappate dall'output di `docker ps`


16

Sto cercando di ottenere tutte le porte utilizzate da un contenitore Docker con questo comando:

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

Quando l'ho eseguito nel terminal ho capito che voglio.

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

Ma ho bisogno di tutte le porte mappate. È possibile creare uno script di shell come questo:

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

Sono stato in giro per alcune ore. Aiutatemi o suggerite come ottenere un output come di seguito.

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,

Risposte:


3

Utilizzando Perl:

sudo docker ps | \
tail -n 1 | \
perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
  • -l: abilita l'elaborazione automatica della fine della linea. Ha due effetti separati. Innanzitutto, chomps $ / (il separatore del record di input) automaticamente se usato con -n o -p. In secondo luogo, assegna $ \ (il separatore del record di output) per avere il valore di ottnum in modo che tutte le istruzioni di stampa abbiano quel separatore aggiunto di nuovo. Se l'ottetto viene omesso, imposta $ \ sul valore corrente di $ /.
  • -a: attiva la modalità autosplit quando usato con an o -p. Un comando di divisione implicita nell'array @F viene eseguito come prima cosa all'interno del ciclo while implicito prodotto da -n o -p.
  • -e: può essere usato per inserire una riga di programma.
  • $,="\n": imposta il separatore del campo di output su \n;
  • foreach(@F){/tcp,?$/&&push(@x,$_)}: per ogni elemento di @F, se l'elemento termina tcpseguito da un facoltativo ,aggiunge l'elemento alla fine di @x;
  • print(@x): stampa ogni elemento di @xseguito dal separatore del campo di output;
% 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

Non conosco più il Perl, ma ti apprezzo molto per questo. Come provare questo codice con in "docker ps".
R.Chispisit,

@ R.Chonpisit La prima riga che ho scritto è pensata per essere incollata sul terminale, il resto è solo una spiegazione di ciò che fa:sudo docker ps | perl -lane '$next=<>&&redo;$,="\n";foreach(@F){/tcp,?$/&&push(@list, $_)};print(@list);last'
kos,

@ R.Chonpisit La versione precedente era errata, vedere l'aggiornamento. Questo dovrebbe funzionare bene:sudo docker ps | tail -n 1 | perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
kos

22

Secondo le pagine man della finestra mobile puoi provare questo:

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

o se hai anche bisogno di un ID:

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

Non è menzionato nella documentazione, ma per formattare l'output devi usare {{}}.

Citazione da 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

Al giorno d'oggi, ci sono alcune note utili sulle {{}}parentesi graffe 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

1
Hellingly sì
Etki

2

Usando awkcon il delimitatore di campo {2,}. Perché {2,}? l'output di psutilizza più di uno spazio come separatore tra le colonne. Significa che possiamo usarlo come separatore per il awkcomando.

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

o per il tuo pscomando

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

o senza tail

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

Uscita campione

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

o

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

Provo il tuo codice in questo modo. echo "29ba3137f3e2 java8 / local: latest / bin / bash 3 ore fa Su 3 ore 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}' ma non ha prodotto nulla.
R.Chispisit,

Certo che no, psha un'altra uscita.
AB

1

finestra mobile ps -q | xargs -n1 porta finestra mobile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.