Comment extraire les ports mappés de la sortie de `docker ps`

16

J'essaie d'obtenir tous les ports utilisés par un conteneur Docker avec cette commande:

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

Quand je l'ai exécuté dans le terminal, j'ai eu envie.

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

Mais j'ai besoin de tous les ports mappés. Est-il possible de faire un script shell comme celui-ci:

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

Je traîne depuis quelques heures. Veuillez aider ou suggérer comment obtenir une sortie comme ci-dessous.

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
la source

Réponses:

3

Utilisation de Perl:

sudo docker ps | \
tail -n 1 | \
perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
  • -l: active le traitement automatique de fin de ligne. Il a deux effets distincts. Tout d'abord, il compile automatiquement $ / (le séparateur d'enregistrement d'entrée) lorsqu'il est utilisé avec -n ou -p. Deuxièmement, il affecte $ \ (le séparateur d'enregistrements de sortie) à la valeur d'octnum afin que toutes les instructions d'impression aient ce séparateur ajouté à nouveau. Si octnum est omis, définit $ \ à la valeur actuelle de $ /.
  • -a: active le mode de fractionnement automatique lorsqu'il est utilisé avec -n ou -p. Une commande de division implicite au tableau @F est effectuée comme première chose à l'intérieur de la boucle while implicite produite par -n ou -p.
  • -e: peut être utilisé pour entrer une ligne de programme.
  • $,="\n": définit le séparateur de champ de sortie sur \n;
  • foreach(@F){/tcp,?$/&&push(@x,$_)}: pour chaque élément de @F, si l'élément se termine par tcpsuivi d'un facultatif ,ajoute l'élément à la fin de @x;
  • print(@x): imprime chaque élément de @xsuivi du séparateur de champ de sortie;
% 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
la source
Je ne connais plus Perl mais je vous en suis très reconnaissant. Comment essayer ce code avec dans "docker ps".
R.Chonpisit
@ R.Chonpisit La première ligne que j'ai écrite est destinée à être copiée-collée sur le terminal, le reste est juste une explication de ce qu'elle fait:sudo docker ps | perl -lane '$next=<>&&redo;$,="\n";foreach(@F){/tcp,?$/&&push(@list, $_)};print(@list);last'
kos
@ R.Chonpisit La version précédente était incorrecte, voir la mise à jour. Cela devrait fonctionner correctement:sudo docker ps | tail -n 1 | perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
kos
22

Selon les pages de manuel de docker, vous pouvez essayer ceci:

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

ou si vous avez également besoin d'une pièce d'identité:

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

Il n'est pas mentionné dans la documentation, mais pour formater la sortie, vous devez l'utiliser {{}}.

Citation de 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

De nos jours, il y a quelques notes utiles sur les {{}}accolades dans 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
la source
1
Hellingly oui
Etki
2

Utilisation awkavec le délimiteur de champ {2,}. Pourquoi {2,}? la sortie de psutilise plus d'un espace comme séparateur entre les colonnes. Cela signifie que nous pouvons l'utiliser comme séparateur pour la awkcommande.

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

ou pour votre pscommande

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

ou sans tail

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

Exemple de sortie

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

ou

% <<<'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
UN B
la source
J'essaie votre code de cette façon. echo "29ba3137f3e2 java8 / local: dernier / bin / bash il y a 3 heures Jusqu'à 3 heures 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}' mais cela n'a rien produit.
R.Chonpisit
Bien sûr que non, psa une autre sortie.
AB
1

docker ps -q | Port docker xargs -n1

Dai Phan
la source