// Convert converts a service configuration to an docker API structures (Config and HostConfig) func Convert(c *config.ServiceConfig, ctx project.Context, clientFactory composeclient.Factory) (*container.Config, *container.HostConfig, error) { restartPolicy, err := restartPolicy(c) if err != nil { return nil, nil, err } exposedPorts, portBindings, err := ports(c) if err != nil { return nil, nil, err } deviceMappings, err := parseDevices(c.Devices) if err != nil { return nil, nil, err } var volumesFrom []string if c.VolumesFrom != nil { volumesFrom, err = getVolumesFrom(c.VolumesFrom, ctx.Project.ServiceConfigs, ctx.ProjectName) if err != nil { return nil, nil, err } } vols := volumes(c, ctx) config := &container.Config{ Entrypoint: strslice.StrSlice(utils.CopySlice(c.Entrypoint)), Hostname: c.Hostname, Domainname: c.DomainName, User: c.User, Env: utils.CopySlice(c.Environment), Cmd: strslice.StrSlice(utils.CopySlice(c.Command)), Image: c.Image, Labels: utils.CopyMap(c.Labels), ExposedPorts: exposedPorts, Tty: c.Tty, OpenStdin: c.StdinOpen, WorkingDir: c.WorkingDir, Volumes: toMap(Filter(vols, isVolume)), MacAddress: c.MacAddress, } ulimits := []*units.Ulimit{} if c.Ulimits.Elements != nil { for _, ulimit := range c.Ulimits.Elements { ulimits = append(ulimits, &units.Ulimit{ Name: ulimit.Name, Soft: ulimit.Soft, Hard: ulimit.Hard, }) } } resources := container.Resources{ CgroupParent: c.CgroupParent, Memory: int64(c.MemLimit), MemorySwap: int64(c.MemSwapLimit), CPUShares: int64(c.CPUShares), CPUQuota: int64(c.CPUQuota), CpusetCpus: c.CPUSet, Ulimits: ulimits, Devices: deviceMappings, } networkMode := c.NetworkMode if c.NetworkMode == "" { if c.Networks != nil && len(c.Networks.Networks) > 0 { networkMode = c.Networks.Networks[0].RealName } } else { switch { case strings.HasPrefix(c.NetworkMode, "service:"): serviceName := c.NetworkMode[8:] if serviceConfig, ok := ctx.Project.ServiceConfigs.Get(serviceName); ok { // FIXME(vdemeester) this is actually not right, should be fixed but not there service, err := ctx.ServiceFactory.Create(ctx.Project, serviceName, serviceConfig) if err != nil { return nil, nil, err } containers, err := service.Containers(context.Background()) if err != nil { return nil, nil, err } if len(containers) != 0 { container := containers[0] containerID, err := container.ID() if err != nil { return nil, nil, err } networkMode = "container:" + containerID } // FIXME(vdemeester) log/warn in case of len(containers) == 0 } case strings.HasPrefix(c.NetworkMode, "container:"): containerName := c.NetworkMode[10:] client := clientFactory.Create(nil) container, err := composecontainer.Get(context.Background(), client, containerName) if err != nil { return nil, nil, err } networkMode = "container:" + container.ID default: // do nothing :) } } hostConfig := &container.HostConfig{ VolumesFrom: volumesFrom, CapAdd: strslice.StrSlice(utils.CopySlice(c.CapAdd)), CapDrop: strslice.StrSlice(utils.CopySlice(c.CapDrop)), ExtraHosts: utils.CopySlice(c.ExtraHosts), Privileged: c.Privileged, Binds: Filter(vols, isBind), DNS: utils.CopySlice(c.DNS), DNSSearch: utils.CopySlice(c.DNSSearch), LogConfig: container.LogConfig{ Type: c.Logging.Driver, Config: utils.CopyMap(c.Logging.Options), }, NetworkMode: container.NetworkMode(networkMode), ReadonlyRootfs: c.ReadOnly, PidMode: container.PidMode(c.Pid), UTSMode: container.UTSMode(c.Uts), IpcMode: container.IpcMode(c.Ipc), PortBindings: portBindings, RestartPolicy: *restartPolicy, ShmSize: int64(c.ShmSize), SecurityOpt: utils.CopySlice(c.SecurityOpt), VolumeDriver: c.VolumeDriver, Resources: resources, } if config.Labels == nil { config.Labels = map[string]string{} } return config, hostConfig, nil }
// Convert converts a service configuration to an docker API structures (Config and HostConfig) func Convert(c *project.ServiceConfig, ctx project.Context) (*container.Config, *container.HostConfig, error) { restartPolicy, err := restartPolicy(c) if err != nil { return nil, nil, err } exposedPorts, portBindings, err := ports(c) if err != nil { return nil, nil, err } deviceMappings, err := parseDevices(c.Devices) if err != nil { return nil, nil, err } var volumesFrom []string if c.VolumesFrom != nil { volumesFrom, err = getVolumesFrom(c.VolumesFrom, ctx.Project.Configs, ctx.ProjectName) if err != nil { return nil, nil, err } } config := &container.Config{ Entrypoint: strslice.StrSlice(utils.CopySlice(c.Entrypoint.Slice())), Hostname: c.Hostname, Domainname: c.DomainName, User: c.User, Env: utils.CopySlice(c.Environment.Slice()), Cmd: strslice.StrSlice(utils.CopySlice(c.Command.Slice())), Image: c.Image, Labels: utils.CopyMap(c.Labels.MapParts()), ExposedPorts: exposedPorts, Tty: c.Tty, OpenStdin: c.StdinOpen, WorkingDir: c.WorkingDir, Volumes: volumes(c, ctx), MacAddress: c.MacAddress, } ulimits := []*units.Ulimit{} if c.Ulimits.Elements != nil { for _, ulimit := range c.Ulimits.Elements { ulimits = append(ulimits, &units.Ulimit{ Name: ulimit.Name, Soft: ulimit.Soft, Hard: ulimit.Hard, }) } } resources := container.Resources{ CgroupParent: c.CgroupParent, Memory: c.MemLimit, MemorySwap: c.MemSwapLimit, CPUShares: c.CPUShares, CPUQuota: c.CPUQuota, CpusetCpus: c.CPUSet, Ulimits: ulimits, Devices: deviceMappings, } hostConfig := &container.HostConfig{ VolumesFrom: volumesFrom, CapAdd: strslice.StrSlice(utils.CopySlice(c.CapAdd)), CapDrop: strslice.StrSlice(utils.CopySlice(c.CapDrop)), ExtraHosts: utils.CopySlice(c.ExtraHosts), Privileged: c.Privileged, Binds: Filter(c.Volumes, isBind), DNS: utils.CopySlice(c.DNS.Slice()), DNSSearch: utils.CopySlice(c.DNSSearch.Slice()), LogConfig: container.LogConfig{ Type: c.LogDriver, Config: utils.CopyMap(c.LogOpt), }, NetworkMode: container.NetworkMode(c.Net), ReadonlyRootfs: c.ReadOnly, PidMode: container.PidMode(c.Pid), UTSMode: container.UTSMode(c.Uts), IpcMode: container.IpcMode(c.Ipc), PortBindings: portBindings, RestartPolicy: *restartPolicy, SecurityOpt: utils.CopySlice(c.SecurityOpt), VolumeDriver: c.VolumeDriver, Resources: resources, } return config, hostConfig, nil }
// Convert converts a service configuration to an docker API structures (Config and HostConfig) func Convert(c *project.ServiceConfig) (*dockerclient.Config, *dockerclient.HostConfig, error) { restartPolicy, err := restartPolicy(c) if err != nil { return nil, nil, err } exposedPorts, portBindings, err := ports(c) if err != nil { return nil, nil, err } deviceMappings, err := parseDevices(c.Devices) if err != nil { return nil, nil, err } config := &dockerclient.Config{ Entrypoint: utils.CopySlice(c.Entrypoint.Slice()), Hostname: c.Hostname, Domainname: c.DomainName, User: c.User, Env: utils.CopySlice(c.Environment.Slice()), Cmd: utils.CopySlice(c.Command.Slice()), Image: c.Image, Labels: utils.CopyMap(c.Labels.MapParts()), ExposedPorts: exposedPorts, Tty: c.Tty, OpenStdin: c.StdinOpen, WorkingDir: c.WorkingDir, VolumeDriver: c.VolumeDriver, Volumes: volumes(c), } hostConfig := &dockerclient.HostConfig{ VolumesFrom: utils.CopySlice(c.VolumesFrom), CapAdd: utils.CopySlice(c.CapAdd), CapDrop: utils.CopySlice(c.CapDrop), CPUShares: c.CPUShares, CPUSetCPUs: c.CPUSet, ExtraHosts: utils.CopySlice(c.ExtraHosts), Privileged: c.Privileged, Binds: Filter(c.Volumes, isBind), Devices: deviceMappings, DNS: utils.CopySlice(c.DNS.Slice()), DNSSearch: utils.CopySlice(c.DNSSearch.Slice()), LogConfig: dockerclient.LogConfig{ Type: c.LogDriver, Config: utils.CopyMap(c.LogOpt), }, Memory: c.MemLimit, MemorySwap: c.MemSwapLimit, NetworkMode: c.Net, ReadonlyRootfs: c.ReadOnly, PidMode: c.Pid, UTSMode: c.Uts, IpcMode: c.Ipc, PortBindings: portBindings, RestartPolicy: *restartPolicy, SecurityOpt: utils.CopySlice(c.SecurityOpt), } return config, hostConfig, nil }
// Convert converts a service configuration to an docker API structures (Config and HostConfig) func Convert(c *config.ServiceConfig, ctx project.Context) (*container.Config, *container.HostConfig, error) { restartPolicy, err := restartPolicy(c) if err != nil { return nil, nil, err } exposedPorts, portBindings, err := ports(c) if err != nil { return nil, nil, err } deviceMappings, err := parseDevices(c.Devices) if err != nil { return nil, nil, err } var volumesFrom []string if c.VolumesFrom != nil { volumesFrom, err = getVolumesFrom(c.VolumesFrom, ctx.Project.ServiceConfigs, ctx.ProjectName) if err != nil { return nil, nil, err } } vols := volumes(c, ctx) config := &container.Config{ Entrypoint: strslice.StrSlice(utils.CopySlice(c.Entrypoint)), Hostname: c.Hostname, Domainname: c.DomainName, User: c.User, Env: utils.CopySlice(c.Environment), Cmd: strslice.StrSlice(utils.CopySlice(c.Command)), Image: c.Image, Labels: utils.CopyMap(c.Labels), ExposedPorts: exposedPorts, Tty: c.Tty, OpenStdin: c.StdinOpen, WorkingDir: c.WorkingDir, Volumes: toMap(Filter(vols, isVolume)), MacAddress: c.MacAddress, StopSignal: c.StopSignal, } ulimits := []*units.Ulimit{} if c.Ulimits.Elements != nil { for _, ulimit := range c.Ulimits.Elements { ulimits = append(ulimits, &units.Ulimit{ Name: ulimit.Name, Soft: ulimit.Soft, Hard: ulimit.Hard, }) } } memorySwappiness := int64(c.MemSwappiness) tmpfs := map[string]string{} for _, path := range c.Tmpfs { split := strings.SplitN(path, ":", 2) if len(split) == 1 { tmpfs[split[0]] = "" } else if len(split) == 2 { tmpfs[split[0]] = split[1] } } blkioWeightDevices := []*blkiodev.WeightDevice{} for _, blkioWeightDevice := range c.BlkioWeightDevice { split := strings.Split(blkioWeightDevice, ":") if len(split) == 2 { weight, err := strconv.ParseUint(split[1], 10, 16) if err != nil { return nil, nil, err } blkioWeightDevices = append(blkioWeightDevices, &blkiodev.WeightDevice{ Path: split[0], Weight: uint16(weight), }) } } blkioDeviceReadBps, err := getThrottleDevice(c.DeviceReadBps) if err != nil { return nil, nil, err } blkioDeviceReadIOps, err := getThrottleDevice(c.DeviceReadIOps) if err != nil { return nil, nil, err } blkioDeviceWriteBps, err := getThrottleDevice(c.DeviceWriteBps) if err != nil { return nil, nil, err } blkioDeviceWriteIOps, err := getThrottleDevice(c.DeviceWriteIOps) if err != nil { return nil, nil, err } resources := container.Resources{ BlkioWeight: uint16(c.BlkioWeight), BlkioWeightDevice: blkioWeightDevices, CgroupParent: c.CgroupParent, Memory: int64(c.MemLimit), MemoryReservation: int64(c.MemReservation), MemorySwap: int64(c.MemSwapLimit), MemorySwappiness: &memorySwappiness, CPUPeriod: int64(c.CPUPeriod), CPUShares: int64(c.CPUShares), CPUQuota: int64(c.CPUQuota), CpusetCpus: c.CPUSet, Ulimits: ulimits, Devices: deviceMappings, OomKillDisable: &c.OomKillDisable, BlkioDeviceReadBps: blkioDeviceReadBps, BlkioDeviceReadIOps: blkioDeviceReadIOps, BlkioDeviceWriteBps: blkioDeviceWriteBps, BlkioDeviceWriteIOps: blkioDeviceWriteIOps, } hostConfig := &container.HostConfig{ VolumesFrom: volumesFrom, CapAdd: strslice.StrSlice(utils.CopySlice(c.CapAdd)), CapDrop: strslice.StrSlice(utils.CopySlice(c.CapDrop)), GroupAdd: c.GroupAdd, ExtraHosts: utils.CopySlice(c.ExtraHosts), Privileged: c.Privileged, Binds: Filter(vols, isBind), DNS: utils.CopySlice(c.DNS), DNSOptions: utils.CopySlice(c.DNSOpt), DNSSearch: utils.CopySlice(c.DNSSearch), Isolation: container.Isolation(c.Isolation), LogConfig: container.LogConfig{ Type: c.Logging.Driver, Config: utils.CopyMap(c.Logging.Options), }, NetworkMode: container.NetworkMode(c.NetworkMode), ReadonlyRootfs: c.ReadOnly, OomScoreAdj: int(c.OomScoreAdj), PidMode: container.PidMode(c.Pid), UTSMode: container.UTSMode(c.Uts), IpcMode: container.IpcMode(c.Ipc), PortBindings: portBindings, RestartPolicy: *restartPolicy, ShmSize: int64(c.ShmSize), SecurityOpt: utils.CopySlice(c.SecurityOpt), Tmpfs: tmpfs, VolumeDriver: c.VolumeDriver, Resources: resources, } if config.Labels == nil { config.Labels = map[string]string{} } return config, hostConfig, nil }