Cách trích xuất các cổng được ánh xạ từ đầu ra của `docker ps`


16

Tôi đang cố gắng để có được tất cả các cổng được sử dụng bởi một Docker container bằng lệnh này:

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

Khi tôi chạy nó trong thiết bị đầu cuối, tôi đã nhận được tôi muốn.

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

Nhưng tôi cần tất cả các cổng được ánh xạ. Có thể tạo một kịch bản shell như thế này:

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

Tôi đã đi loanh quanh vài giờ. Hãy giúp đỡ, hoặc đề nghị làm thế nào để có được một đầu ra như dưới đây.

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,

Câu trả lời:


3

Sử dụng Perl:

sudo docker ps | \
tail -n 1 | \
perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
  • -l: cho phép xử lý kết thúc dòng tự động. Nó có hai hiệu ứng riêng biệt. Đầu tiên, nó tự động kiểm tra $ / (dấu tách bản ghi đầu vào) khi được sử dụng với -n hoặc -p. Thứ hai, nó gán $ \ (dấu tách bản ghi đầu ra) có giá trị octnum để bất kỳ câu lệnh in nào sẽ có dấu phân cách đó được thêm lại. Nếu octnum bị bỏ qua, đặt $ \ thành giá trị hiện tại là $ /.
  • -a: bật chế độ tự động nhận khi được sử dụng với -n hoặc -p. Lệnh chia ngầm định cho mảng @F được thực hiện như là điều đầu tiên bên trong vòng lặp ngầm định được tạo bởi -n hoặc -p.
  • -e: có thể được sử dụng để nhập một dòng chương trình.
  • $,="\n": đặt dấu tách trường đầu ra thành \n;
  • foreach(@F){/tcp,?$/&&push(@x,$_)}: cho mỗi phần tử của @F, nếu phần tử kết thúc bằng tcptheo sau là tùy chọn ,thêm phần tử vào cuối @x;
  • print(@x): in từng phần tử @xtheo sau bởi dấu tách trường đầu ra;
% 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

Tôi không biết Perl nữa nhưng tôi thực sự đánh giá cao bạn vì điều này. Cách thử mã này trong "docker ps".
R.Chonpisit

@ R.Chonpisit Dòng đầu tiên tôi viết có nghĩa là được sao chép-chạy trên thiết bị đầu cuối, phần còn lại chỉ là một lời giải thích về những gì nó làm:sudo docker ps | perl -lane '$next=<>&&redo;$,="\n";foreach(@F){/tcp,?$/&&push(@list, $_)};print(@list);last'
kos

@ R.Chonpisit Phiên bản trước đã sai, xem bản cập nhật. Điều này sẽ hoạt động tốt:sudo docker ps | tail -n 1 | perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
kos

22

Theo các trang man docker bạn có thể thử điều này:

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

hoặc nếu bạn cũng cần ID:

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

Nó không được đề cập trong tài liệu, nhưng để định dạng đầu ra bạn phải sử dụng {{}}.

Trích dẫn từ 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

Ngày nay, có một vài lưu ý hữu ích về {{}}niềng răng trong 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 vâng
Etki

2

Sử dụng awkvới dấu phân cách trường {2,}. Tại sao {2,}? đầu ra của việc pssử dụng nhiều hơn một khoảng trắng làm dấu phân cách giữa các cột. Có nghĩa là, chúng ta có thể sử dụng điều này như là dấu phân cách cho awklệnh.

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

hoặc cho pslệnh của bạn

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

hoặc không có tail

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

Sản lượng mẫu

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

hoặc là

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

Tôi thử mã của bạn theo cách này. echo "29ba3137f3e2 java8 / local: muộn nhất / bin / bash 3 giờ trước , 0.0.0.0:32782->10523/tcp DEMO-20151118124751 "| awk -F "{2,}" '{in $ 6}' nhưng nó không tạo ra gì cả.
R.Chonpisit

Chắc chắn là không, pscó đầu ra khác.
AB

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.