// updateNameservers assigns each container the same nameservers as the host. func updateNameservers(dk docker.Client, containers []db.Container) { hostResolv, err := ioutil.ReadFile("/etc/resolv.conf") if err != nil { log.WithError(err).Error("failed to read /etc/resolv.conf") } nsRE := regexp.MustCompile("nameserver\\s([0-9]{1,3}\\.){3}[0-9]{1,3}\\s+") matches := nsRE.FindAllString(string(hostResolv), -1) newNameservers := strings.Join(matches, "\n") for _, dbc := range containers { id := dbc.DockerID currNameservers, err := dk.GetFromContainer(id, "/etc/resolv.conf") if err != nil { log.WithError(err).Error("failed to get /etc/resolv.conf") return } if newNameservers != currNameservers { err = dk.WriteToContainer(id, newNameservers, "/etc", "resolv.conf", 0644) if err != nil { log.WithError(err).Error( "failed to update /etc/resolv.conf") } } } }
func updateEtcHosts(dk docker.Client, containers []db.Container, labels []db.Label, connections []db.Connection) { /* Map label name to its IP. */ labelIP := make(map[string]string) /* Map label to a list of all labels it connect to. */ conns := make(map[string][]string) for _, l := range labels { labelIP[l.Label] = l.IP } for _, conn := range connections { if conn.To == stitch.PublicInternetLabel || conn.From == stitch.PublicInternetLabel { continue } conns[conn.From] = append(conns[conn.From], conn.To) } for _, dbc := range containers { id := dbc.DockerID currHosts, err := dk.GetFromContainer(id, "/etc/hosts") if err != nil { log.WithError(err).Error("Failed to get /etc/hosts") return } newHosts := generateEtcHosts(dbc, labelIP, conns) if newHosts != currHosts { err = dk.WriteToContainer(id, newHosts, "/etc", "hosts", 0644) if err != nil { log.WithError(err).Error("Failed to update /etc/hosts") } } } }