Как извлечь сопоставленные порты из вывода `docker ps`

Я пытаюсь получить все порты, используемые контейнером Docker, с помощью этой команды:

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

Когда я запустил его в терминале, я получил.

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

Но мне нужны все сопоставленные порты. Можно ли сделать сценарий оболочки следующим образом:

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

Я несколько раз болтался. Пожалуйста, помогите или предложите, как получить выход, как показано ниже.

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,
1
задан 18 November 2015 в 14:44

3 ответа

В соответствии с страницами docker man вы можете попробовать следующее:

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

или если вам также нужен ID:

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

Он не упоминается в документации, но

Цитата из 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"

Докер 1.10.3

В настоящее время в 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
19
ответ дан 23 May 2018 в 15:41

Используя awk с разделителем поля {2,}. Почему {2,}? вывод ps использует в качестве разделителя между столбцами более одного места. Значит, мы можем использовать это как разделитель для команды awk.

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

или для вашей команды ps

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

или без tail

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

Пример вывода

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

или

% <<<'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
2
ответ дан 23 May 2018 в 15:41
  • 1
    Я пробую ваш код таким образом. echo " 29ba3137f3e2 java8 / local: latest / bin / bash 3 часа назад До 3 часов 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} & Quot; '{print $ 6}', но ничего не произвело. – R.Chonpisit 18 November 2015 в 13:58
  • 2
    Конечно, ps имеет другой выход. – A.B. 18 November 2015 в 14:16

docker ps -q | Порт докеры xargs -n1

0
ответ дан 23 May 2018 в 15:41

Другие вопросы по тегам:

Похожие вопросы: