func (c *Container) addNetNs(config *dockerclient.HostConfig, service project.Service, containers []project.Container) (*dockerclient.HostConfig, error) { if len(containers) == 0 { return nil, fmt.Errorf("Failed to find container for networks ns %v", c.service.Config().Net) } id, err := containers[0].ID() if err != nil { return nil, err } config.NetworkMode = "container:" + id return config, nil }
func (dg *DockerGoClient) CreateContainer(config *docker.Config, hostConfig *docker.HostConfig, name string) DockerContainerMetadata { timeout := ttime.After(createContainerTimeout) hostConfig.NetworkMode = "host" ctx, cancelFunc := context.WithCancel(context.TODO()) // Could pass one through from engine response := make(chan DockerContainerMetadata, 1) go func() { response <- dg.createContainer(ctx, config, hostConfig, name) }() select { case resp := <-response: return resp case <-timeout: cancelFunc() return DockerContainerMetadata{Error: &DockerTimeoutError{createContainerTimeout, "created"}} } }
func (dg *DockerGoClient) createContainer(ctx context.Context, config *docker.Config, hostConfig *docker.HostConfig, name string) DockerContainerMetadata { client := dg.dockerClient hostConfig.NetworkMode = "host" containerOptions := docker.CreateContainerOptions{Config: config, HostConfig: hostConfig, Name: name} dockerContainer, err := client.CreateContainer(containerOptions) select { case <-ctx.Done(): // Parent function already timed out; no need to get container metadata return DockerContainerMetadata{} default: } if err != nil { return DockerContainerMetadata{Error: CannotXContainerError{"Create", err.Error()}} } return dg.containerMetadata(dockerContainer.ID) }