From e574bbf55ebc13387924a1d3b1cbf9d2403e0956 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Tue, 17 Sep 2013 21:09:17 +0000 Subject: [PATCH] Do not reference ports for linking containers --- api.go | 1 - api_params.go | 1 - commands.go | 8 ++++---- container.go | 5 ++--- links.go | 56 ++++++++++++++++++++++++++++++--------------------- utils.go | 4 ++-- 6 files changed, 41 insertions(+), 34 deletions(-) diff --git a/api.go b/api.go index 9a3c89f51..36a853e6c 100644 --- a/api.go +++ b/api.go @@ -993,7 +993,6 @@ func getLinksJSON(srv *Server, version float64, w http.ResponseWriter, r *http.R ID: l.ID(), To: l.ToID, From: l.FromID, - Port: fmt.Sprint(l.Port), Alias: l.Alias, }) } diff --git a/api_params.go b/api_params.go index fe6eaa9fd..897eb660d 100644 --- a/api_params.go +++ b/api_params.go @@ -125,6 +125,5 @@ type APILink struct { ID string To string From string - Port string Alias string } diff --git a/commands.go b/commands.go index 31a5641ba..8e96ab3b3 100644 --- a/commands.go +++ b/commands.go @@ -1112,8 +1112,8 @@ func (cli *DockerCli) CmdPs(args ...string) error { return nil } -func (cli *DockerCli) CmdLink(args ...string) error { - cmd := Subcmd("link", "[OPTIONS] CONTAINER", "Get the links for a container") +func (cli *DockerCli) CmdLinks(args ...string) error { + cmd := Subcmd("links", "[OPTIONS] CONTAINER", "Get the links for a container") flRm := cmd.Bool("rm", false, "Remove an existing link by the link ID") if err := cmd.Parse(args); err != nil { @@ -1143,10 +1143,10 @@ func (cli *DockerCli) CmdLink(args ...string) error { } w := tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0) - fmt.Fprintf(w, "ID\tFROM\tTO\tPORT\tALIAS") + fmt.Fprintf(w, "ID\tFROM\tTO\tALIAS") fmt.Fprintf(w, "\n") for _, l := range links { - fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s", l.ID, l.From, l.To, l.Port, l.Alias) + fmt.Fprintf(w, "%s\t%s\t%s\t%s", l.ID, l.From, l.To, l.Alias) fmt.Fprintf(w, "\n") } w.Flush() diff --git a/container.go b/container.go index 7843df654..75119f656 100644 --- a/container.go +++ b/container.go @@ -181,7 +181,7 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig, cmd.Var(&flLxcOpts, "lxc-conf", "Add custom lxc options -lxc-conf=\"lxc.cgroup.cpuset.cpus = 0,1\"") var flLinks ListOpts - cmd.Var(&flLinks, "link", "Add link to another container (containerid:port:alias)") + cmd.Var(&flLinks, "link", "Add link to another container (containerid:alias)") if err := cmd.Parse(args); err != nil { return nil, nil, cmd, err @@ -829,10 +829,9 @@ func (container *Container) Start(hostConfig *HostConfig) error { if err != nil { return err } - p := NewPort(splitProtoPort(parts["port"])) linkedContainer := runtime.Get(parts["id"]) - link, err := runtime.links.NewLink(container, linkedContainer, runtime.networkManager.bridgeIface, p, parts["alias"]) + link, err := runtime.links.NewLink(container, linkedContainer, runtime.networkManager.bridgeIface, parts["alias"]) if err != nil { return err } diff --git a/links.go b/links.go index 12f5b9cef..ec455526d 100644 --- a/links.go +++ b/links.go @@ -15,9 +15,9 @@ type Link struct { FromIP string ToIP string BridgeInterface string - Port Port Alias string FromEnvironment []string + ports []Port isEnabled bool } @@ -25,22 +25,25 @@ type LinkRepository struct { links map[string]*Link } -func (r *LinkRepository) NewLink(to, from *Container, bridgeInterface string, p Port, alias string) (*Link, error) { +func (r *LinkRepository) NewLink(to, from *Container, bridgeInterface string, alias string) (*Link, error) { if !from.State.Running { return nil, fmt.Errorf("Cannot link to a non running container: %s AS %s", from.ID, alias) } - if !from.Exposes(p) { - return nil, fmt.Errorf("Cannot link to %s because %s is not exposed", from.ID, p) + ports := make([]Port, len(from.Config.ExposedPorts)) + var i int + for k := range from.Config.ExposedPorts { + ports[i] = k + i++ } l := &Link{ FromID: utils.TruncateID(from.ID), ToID: utils.TruncateID(to.ID), BridgeInterface: bridgeInterface, Alias: alias, - Port: p, FromIP: from.NetworkSettings.IPAddress, ToIP: to.NetworkSettings.IPAddress, FromEnvironment: from.Config.Env, + ports: ports, } if err := r.registerLink(l); err != nil { return nil, err @@ -53,7 +56,12 @@ func (l *Link) ID() string { } func (l *Link) ToEnv() []string { - env := []string{fmt.Sprintf("%s_ADDR=%s://%s:%s", strings.ToUpper(l.Alias), l.Port.Proto(), l.FromIP, l.Port.Port())} + env := []string{} + // Load exposed ports into the environment + for _, p := range l.ports { + env = append(env, fmt.Sprintf("%s_%s_ADDR=%s://%s:%s", strings.ToUpper(l.Alias), p.Port(), p.Proto(), l.FromIP, p.Port())) + } + if l.FromEnvironment != nil { for _, v := range l.FromEnvironment { parts := strings.Split(v, "=") @@ -83,24 +91,26 @@ func (l *Link) Disable() { } func (l *Link) toggle(action string) error { - if err := iptables.Raw(action, "FORWARD", - "-i", l.BridgeInterface, "-o", l.BridgeInterface, - "-p", l.Port.Proto(), - "-s", l.ToIP, - "--dport", l.Port.Port(), - "-d", l.FromIP, - "-j", "ACCEPT"); err != nil { - return err - } + for _, p := range l.ports { + if err := iptables.Raw(action, "FORWARD", + "-i", l.BridgeInterface, "-o", l.BridgeInterface, + "-p", p.Proto(), + "-s", l.ToIP, + "--dport", p.Port(), + "-d", l.FromIP, + "-j", "ACCEPT"); err != nil { + return err + } - if err := iptables.Raw(action, "FORWARD", - "-i", l.BridgeInterface, "-o", l.BridgeInterface, - "-p", l.Port.Proto(), - "-s", l.FromIP, - "--sport", l.Port.Port(), - "-d", l.ToIP, - "-j", "ACCEPT"); err != nil { - return err + if err := iptables.Raw(action, "FORWARD", + "-i", l.BridgeInterface, "-o", l.BridgeInterface, + "-p", p.Proto(), + "-s", l.FromIP, + "--sport", p.Port(), + "-d", l.ToIP, + "-j", "ACCEPT"); err != nil { + return err + } } return nil } diff --git a/utils.go b/utils.go index 9ff0d00af..a3dca729f 100644 --- a/utils.go +++ b/utils.go @@ -284,7 +284,7 @@ func migratePortMappings(config *Config) error { } // Links come in the format of -// id:port:alias +// id:alias func parseLink(rawLink string) (map[string]string, error) { - return utils.PartParser("id:port:alias", rawLink) + return utils.PartParser("id:alias", rawLink) }