// StartContainer starts a container and links to an // ambassador container sharing the build machiens volume. func (c *Client) StartContainer(id string, conf *dockerclient.HostConfig) error { conf.VolumesFrom = append(conf.VolumesFrom, c.info.Id) if len(conf.NetworkMode) == 0 { conf.NetworkMode = "container:" + c.info.Id } return c.Client.StartContainer(id, conf) }
func startContainer(docker *dockerclient.DockerClient, containerId string, additionalCapabilities []string, ctx *ContainerContext) error { //Build the port bindings needed when running the container dockerHostConfig := new(dockerclient.HostConfig) dockerHostConfig.PortBindings = make(map[string][]dockerclient.PortBinding) for k, v := range ctx.PortContext { pb := dockerclient.PortBinding{HostPort: v} portBindings := []dockerclient.PortBinding{pb} dockerHostConfig.PortBindings[k] = portBindings } dockerHostConfig.Links = ctx.Links dockerHostConfig.CapAdd = additionalCapabilities //Start the container return docker.StartContainer(containerId, dockerHostConfig) }
func (c *Container) populateAdditionalHostConfig(hostConfig *dockerclient.HostConfig) error { links := map[string]string{} for _, link := range c.service.DependentServices() { if _, ok := c.service.context.Project.Configs[link.Target]; !ok { continue } service, err := c.service.context.Project.CreateService(link.Target) if err != nil { return err } containers, err := service.Containers() if err != nil { return err } if link.Type == project.REL_TYPE_LINK { c.addLinks(links, service, link, containers) } else if link.Type == project.REL_TYPE_IPC_NAMESPACE { hostConfig, err = c.addIpc(hostConfig, service, containers) } else if link.Type == project.REL_TYPE_NET_NAMESPACE { hostConfig, err = c.addNetNs(hostConfig, service, containers) } if err != nil { return err } } hostConfig.Links = []string{} for k, v := range links { hostConfig.Links = append(hostConfig.Links, strings.Join([]string{v, k}, ":")) } for _, v := range c.service.Config().ExternalLinks { hostConfig.Links = append(hostConfig.Links, v) } return nil }
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 %", c.service.Config().Net) } id, err := containers[0].Id() if err != nil { return nil, err } config.NetworkMode = "container:" + id return config, nil }
func (c *Container) addIpc(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 IPC %v", c.service.Config().Ipc) } id, err := containers[0].ID() if err != nil { return nil, err } config.IpcMode = "container:" + id return config, nil }