`ডকার 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.