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 couru 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 créer un script shell comme ceci:
#!/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. S'il vous plaît 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,
Utiliser Perl:
Sudo docker ps | \
tail -n 1 | \
Perl -lae '$,="\n";foreach(@F){/tcp,?$/&&Push(@x,$_)};print(@x)'
-l
: active le traitement de fin de ligne automatique. Il a deux effets distincts. Premièrement, il chomps automatiquement $/(le séparateur d'enregistrement d'entrée) lorsqu'il est utilisé avec -n ou -p. Deuxièmement, il attribue à $\(le séparateur d'enregistrement de sortie) la valeur d'octnum afin que toutes les instructions d'impression ajoutent ce séparateur. Si octnum est omis, définit $\sur la valeur actuelle de $ /.-a
: active le mode autosplit lorsqu'il est utilisé avec un -n ou -p. Une commande de fractionnement implicite dans le tableau @F est effectuée en premier dans 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 en sortie sur \n
;foreach(@F){/tcp,?$/&&Push(@x,$_)}
: pour chaque élément de @F
, si l'élément se termine par tcp
suivi d'un ,
facultatif, ajoute l'élément à la fin de @x
;print(@x)
: affiche chaque élément de @x
suivi du séparateur de champ en 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
Selon les pages de manuel de docker, vous pouvez essayer ceci:
Sudo docker ps --format "{{.Ports}}"
ou si vous avez également besoin d'un identifiant:
Sudo docker ps --format "{{.ID}}: {{.Ports}}"
Cela n'est pas mentionné dans la documentation, mais pour formater la sortie, vous devez 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"
De nos jours, il y a quelques notes utiles sur les {{}}
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
Utilisation de awk
avec le délimiteur de zone {2,}
. Pourquoi {2,}
? la sortie de ps
utilise plusieurs espaces comme séparateur entre les colonnes. Cela signifie que nous pouvons l’utiliser comme séparateur pour la commande awk
.
awk -F" {2,}" '{print $6}'
ou pour votre commande ps
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
docker ps -q | port de docker xargs -n1