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é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

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.