func (container *Container) allocatePort(eng *engine.Engine, port nat.Port, bindings nat.PortMap) error { binding := bindings[port] if container.hostConfig.PublishAllPorts && len(binding) == 0 { binding = append(binding, nat.PortBinding{}) } for i := 0; i < len(binding); i++ { b := binding[i] job := eng.Job("allocate_port", container.ID) job.Setenv("HostIP", b.HostIp) job.Setenv("HostPort", b.HostPort) job.Setenv("Proto", port.Proto()) job.Setenv("ContainerPort", port.Port()) portEnv, err := job.Stdout.AddEnv() if err != nil { return err } if err := job.Run(); err != nil { eng.Job("release_interface", container.ID).Run() return err } b.HostIp = portEnv.Get("HostIP") b.HostPort = portEnv.Get("HostPort") binding[i] = b } bindings[port] = binding return nil }