From 410ebe379dbf60d8fd75ba695e4e8036fdba6b65 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Wed, 6 Mar 2013 00:39:03 -0800 Subject: [PATCH] docker port: lookup public-facing tcp ports for a container --- server/server.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/server/server.go b/server/server.go index 93d53cd2b7..bc642cdbb0 100644 --- a/server/server.go +++ b/server/server.go @@ -44,6 +44,7 @@ func (srv *Server) Help() string { {"ps", "Display a list of containers"}, {"pull", "Download a tarball and create a container from it"}, {"put", "Upload a tarball and create a container from it"}, + {"port", "Lookup the public-facing port which is NAT-ed to PRIVATE_PORT"}, {"rm", "Remove containers"}, {"kill", "Kill a running container"}, {"wait", "Wait for the state of a container to change"}, @@ -311,6 +312,30 @@ func (srv *Server) CmdInspect(stdin io.ReadCloser, stdout io.Writer, args ...str return nil } +func (srv *Server) CmdPort(stdin io.ReadCloser, stdout io.Writer, args ...string) error { + cmd := rcli.Subcmd(stdout, "port", "[OPTIONS] CONTAINER PRIVATE_PORT", "Lookup the public-facing port which is NAT-ed to PRIVATE_PORT") + if err := cmd.Parse(args); err != nil { + cmd.Usage() + return nil + } + if cmd.NArg() != 2 { + cmd.Usage() + return nil + } + name := cmd.Arg(0) + privatePort := cmd.Arg(1) + if container := srv.containers.Get(name); container == nil { + return errors.New("No such container: " + name) + } else { + if frontend, exists := container.NetworkSettings.PortMapping[privatePort]; !exists { + return fmt.Errorf("No private port '%s' allocated on %s", privatePort, name) + } else { + fmt.Fprintln(stdout, frontend) + } + } + return nil +} + // 'docker rmi NAME' removes all images with the name NAME func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string) error { cmd := rcli.Subcmd(stdout, "rmimage", "[OPTIONS] IMAGE", "Remove an image")