

コンテナの80ポートを動的にマッピングした時にホストOSにマッピングされたポートをdocker
inspectコマンドだけで取得しようと思いましたが、どう頑張ってもうまくいきません。  
go langのテンプレートに詳しい方のアドバイスを頂ければと考えました。

下記は、試みたことです。

コンテナの80ポートを動的にホストOSのポートに割り付けます。

[code]

    $ docker run -p 80 -d -it --name test ubuntu:18.04
    $ docker ps | grep test
    9dda4ab9febf        ubuntu:18.04                     "/bin/bash"              23 seconds ago      Up 22 seconds       0.0.0.0:32770->80/tcp     test
    $ 
    
[/code]

docker inspectでは、下記の通り、80/tcpが32770にマッピングされた情報が出力されています。

[code]

    $ docker inspect test | jq '.[0].NetworkSettings.Ports'
    {
      "80/tcp": [
        {
          "HostIp": "0.0.0.0",
          "HostPort": "32770"
        }
      ]
    }
    
[/code]

下記で取得することはできるのですが、複数のポートが割り付けられた場合にコンテナの80ポートを指定したいと考えました。

[code]

    $ docker inspect --format='{{range .NetworkSettings.Ports}}{{range .}}{{.HostPort}}{{end}}{{end}}' test
    32770
    $
    
[/code]

"80/tcp"を指定すればよいかと考えましたが下記の通りだめでした。

[code]

    $ docker inspect --format='{{range .NetworkSettings.Ports}}{{range .80/tcp}}{{.HostPort}}{{end}}{{end}}' test
    Template parsing error: template: :1: unexpected "/" in operand
    $ 
    
[/code]

エスケープ文字の問題だとは思うのですが、"\"や"で囲ってもうまくいきませんでした。


CC BY-SA 4.0
2018-06-28T04:32:15.083
45114
2018-07-31T16:27:41.613
5285
question
go docker
docker inspect で動的に割り付けられたポートを取り出す


`80/tcp`ポートを持つコンテナをフィルタする場合はこのような構文でいかがでしょうか。

[code]

    docker inspect test --format='{{ (index (index .NetworkSettings.Ports "80/tcp") 0) }}'
    
    --> map[HostIp:0.0.0.0 HostPort:5401]
    
[/code]

コンテナのポートだけを表示したい場合は

[code]

    docker inspect test --format='{{ (index (index .NetworkSettings.Ports "80/tcp") 0).HostPort }}'
    
    --> 5401
    
[/code]

もしくは`docker port`コマンドを使ったほうが簡潔かもしれません。

[code]

    docker port test | grep '80/tcp'
    
    --> 80/tcp -> 0.0.0.0:5401
    
[/code]


CC BY-SA 4.0
2018-07-31T16:27:41.613
47143
2018-07-31T16:27:41.613
32
45114
answer