Do not reference ports for linking containers

This commit is contained in:
Michael Crosby
2013-09-17 21:09:17 +00:00
parent 377bfc3ad2
commit e574bbf55e
6 changed files with 41 additions and 34 deletions
-1
View File
@@ -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,
})
}
-1
View File
@@ -125,6 +125,5 @@ type APILink struct {
ID string
To string
From string
Port string
Alias string
}
+4 -4
View File
@@ -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()
+2 -3
View File
@@ -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
}
+33 -23
View File
@@ -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
}
+2 -2
View File
@@ -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)
}