次のコマンドを使用して、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,
Perlの使用:
Sudo docker ps | \
tail -n 1 | \
Perl -lae '$,="\n";foreach(@F){/tcp,?$/&&Push(@x,$_)};print(@x)'
-l
:自動行末処理を有効にします。 2つの別々の効果があります。まず、-nまたは-pと共に使用すると、自動的に$ /(入力レコードの区切り記号)が削除されます。次に、$ \(出力レコードセパレーター)にoctnumの値を割り当てて、printステートメントがそのセパレーターを再び追加するようにします。 octnumが省略された場合、$ \を現在の値$ /に設定します。-a
:-nまたは-pとともに使用すると、自動分割モードがオンになります。 @F配列への暗黙的なsplitコマンドは、-nまたは-pによって生成される暗黙的なwhileループ内で最初に実行されます。-e
:プログラムの1行を入力するために使用できます。$,="\n"
:出力フィールド区切り文字を\n
に設定します。foreach(@F){/tcp,?$/&&Push(@x,$_)}
:@F
の各要素について、要素がtcp
で終わり、その後にオプションの,
が続く場合、@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
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"
最近、{{}}
の中の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
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
ドッカーps -q | xargs -n1ドッカーポート