`ডকার PS` এর আউটপুট থেকে কীভাবে ম্যাপযুক্ত পোর্টগুলি বের করা যায়


16

আমি এই কমান্ডের সাহায্যে একটি ডকার ধারক দ্বারা সমস্ত বন্দর ব্যবহার করার চেষ্টা করছি:

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,

উত্তর:


3

পার্ল ব্যবহার:

sudo docker ps | \
tail -n 1 | \
perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
  • -l: স্বয়ংক্রিয় লাইন-এন্ডিং প্রসেসিং সক্ষম করে। এর দুটি পৃথক প্রভাব রয়েছে। প্রথমে, -n বা -p ব্যবহার করার পরে এটি স্বয়ংক্রিয়ভাবে ps / (ইনপুট রেকর্ড বিভাজক) চম্পস করে। দ্বিতীয়ত, এটি t \ (আউটপুট রেকর্ড বিভাজক )কে অক্টনামের মান রাখার জন্য নির্ধারিত করে যাতে কোনও মুদ্রণ বিবরণীতে সেই বিভাজকটিকে আবার যুক্ত করা যায়। যদি অক্টনাম বাদ দেওয়া হয় তবে $ \ কে বর্তমান মান $ / এর সাথে সেট করে।
  • -a: যখন -n বা -p ব্যবহার করা হয় তখন অটোস্প্লিট মোড চালু করে। @F অ্যারেতে একটি অন্তর্নিহিত স্প্লিট কমান্ডটি অন্তর্নিহিত অভ্যন্তরের মধ্যে প্রথম জিনিস হিসাবে সম্পন্ন করা হয় যখন -n বা -p দ্বারা উত্পাদিত লুপ হয়।
  • -e: প্রোগ্রামের এক লাইনে প্রবেশের জন্য ব্যবহৃত হতে পারে।
  • $,="\n": আউটপুট ক্ষেত্র বিভাজক সেট করে \n;
  • foreach(@F){/tcp,?$/&&push(@x,$_)}: প্রতিটি উপাদানের জন্য @F, যদি উপাদানটি tcpএকটি al ,চ্ছিক দ্বারা অনুসরণ করে শেষ হয় তখন উপাদানটি যুক্ত করে @x;
  • print(@x): @xআউটপুট ক্ষেত্র বিভাজক দ্বারা অনুসরণ প্রতিটি উপাদান মুদ্রণ ;
% 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

আমি পার্লকে আর কখনও চিনি না তবে এর জন্য আমি আপনার কাছে সত্যই প্রশংসা করি। "ডকার পিএস" এর মাধ্যমে এই কোডটি কীভাবে চেষ্টা করবেন।
আর.চনপিসিট

@ আর। চনপিসিট প্রথম যে লাইনটি লিখেছেন তা হ'ল টার্মিনালে অনুলিপিটি চালানো, বাকি অংশটি এটি কী করে তা কেবল একটি ব্যাখ্যা:sudo docker ps | perl -lane '$next=<>&&redo;$,="\n";foreach(@F){/tcp,?$/&&push(@list, $_)};print(@list);last'
kos

@ আর.চনপিসিট পূর্ববর্তী সংস্করণটি ভুল ছিল, আপডেটটি দেখুন। এটি সূক্ষ্মভাবে কাজ করা উচিত:sudo docker ps | tail -n 1 | perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
কোস

22

ডকার ম্যান পৃষ্ঠাগুলি অনুসারে আপনি এটি ব্যবহার করতে পারেন:

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

অথবা আপনার যদি আইডি দরকার হয়:

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

1
hellingly হ্যাঁ
Etki

2

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

আমি আপনার কোডটি এইভাবে চেষ্টা করি। প্রতিধ্বনি "29ba3137f3e2 জাভা 8 / স্থানীয়: সর্বশেষ / বিন / বাশ 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 ডেমো-20151118124751 "| awk -F "{2,}" '{মুদ্রণ করুন $ 6}' তবে এটি কিছুই তৈরি করে নি।
আর.চোনপিসিট

অবশ্যই না, psঅন্য আউটপুট আছে।
এবি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.