github.com/torfuzx/docker@v1.8.1/api/client/port.go (about)

     1  package client
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"strings"
     7  
     8  	Cli "github.com/docker/docker/cli"
     9  	flag "github.com/docker/docker/pkg/mflag"
    10  	"github.com/docker/docker/pkg/nat"
    11  )
    12  
    13  // CmdPort lists port mappings for a container.
    14  // If a private port is specified, it also shows the public-facing port that is NATed to the private port.
    15  //
    16  // Usage: docker port CONTAINER [PRIVATE_PORT[/PROTO]]
    17  func (cli *DockerCli) CmdPort(args ...string) error {
    18  	cmd := Cli.Subcmd("port", []string{"CONTAINER [PRIVATE_PORT[/PROTO]]"}, "List port mappings for the CONTAINER, or lookup the public-facing port that\nis NAT-ed to the PRIVATE_PORT", true)
    19  	cmd.Require(flag.Min, 1)
    20  
    21  	cmd.ParseFlags(args, true)
    22  
    23  	serverResp, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, nil)
    24  	if err != nil {
    25  		return err
    26  	}
    27  
    28  	defer serverResp.body.Close()
    29  
    30  	var c struct {
    31  		NetworkSettings struct {
    32  			Ports nat.PortMap
    33  		}
    34  	}
    35  
    36  	if err := json.NewDecoder(serverResp.body).Decode(&c); err != nil {
    37  		return err
    38  	}
    39  
    40  	if cmd.NArg() == 2 {
    41  		var (
    42  			port  = cmd.Arg(1)
    43  			proto = "tcp"
    44  			parts = strings.SplitN(port, "/", 2)
    45  		)
    46  
    47  		if len(parts) == 2 && len(parts[1]) != 0 {
    48  			port = parts[0]
    49  			proto = parts[1]
    50  		}
    51  		natPort := port + "/" + proto
    52  		newP, err := nat.NewPort(proto, port)
    53  		if err != nil {
    54  			return err
    55  		}
    56  		if frontends, exists := c.NetworkSettings.Ports[newP]; exists && frontends != nil {
    57  			for _, frontend := range frontends {
    58  				fmt.Fprintf(cli.out, "%s:%s\n", frontend.HostIP, frontend.HostPort)
    59  			}
    60  			return nil
    61  		}
    62  		return fmt.Errorf("Error: No public port '%s' published for %s", natPort, cmd.Arg(0))
    63  	}
    64  
    65  	for from, frontends := range c.NetworkSettings.Ports {
    66  		for _, frontend := range frontends {
    67  			fmt.Fprintf(cli.out, "%s -> %s:%s\n", from, frontend.HostIP, frontend.HostPort)
    68  		}
    69  	}
    70  
    71  	return nil
    72  }