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 }