in docker/watcher.go [372:420]
func (w *watcher) listContainers(options container.ListOptions) ([]*Container, error) {
log := w.log
log.Debug("List containers")
ctx, cancel := context.WithTimeout(w.ctx, dockerRequestTimeout)
defer cancel()
containers, err := w.client.ContainerList(ctx, options)
if err != nil {
return nil, err
}
result := make([]*Container, len(containers))
for idx, c := range containers {
var ipaddresses []string
if c.NetworkSettings != nil {
// Handle alternate platforms like VMWare's VIC that might not have this data.
for _, net := range c.NetworkSettings.Networks {
if net.IPAddress != "" {
ipaddresses = append(ipaddresses, net.IPAddress)
}
}
}
// If there are no network interfaces, assume that the container is on host network
// Inspect the container directly and use the hostname as the IP address in order
if len(ipaddresses) == 0 {
log.Debugf("Inspect container %s", c.ID)
ctx, cancel := context.WithTimeout(w.ctx, dockerRequestTimeout)
defer cancel()
info, err := w.client.ContainerInspect(ctx, c.ID)
if err == nil {
ipaddresses = append(ipaddresses, info.Config.Hostname)
} else {
log.Warnf("unable to inspect container %s due to error %+v", c.ID, err)
}
}
result[idx] = &Container{
ID: c.ID,
Name: c.Names[0][1:], // Strip '/' from container names
Image: c.Image,
Labels: c.Labels,
Ports: c.Ports,
IPAddresses: ipaddresses,
}
}
return result, nil
}