github.com/hamo/docker@v1.11.1/api/client/port.go (about)

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