in executors/docker/docker.go [297:364]
func (e *executor) createService(
serviceIndex int,
service, version, image string,
definition common.Image,
linkNames []string,
) (*types.Container, error) {
if service == "" {
return nil, common.MakeBuildError("invalid service image name: %s", definition.Name).WithFailureReason(common.ConfigurationError)
}
if e.volumesManager == nil {
return nil, errVolumesManagerUndefined
}
var serviceName string
if strings.HasPrefix(version, "@sha256") {
serviceName = fmt.Sprintf("%s%s...", service, version) // service@digest
} else {
serviceName = fmt.Sprintf("%s:%s...", service, version) // service:version
}
e.BuildLogger.Println("Starting service", serviceName)
serviceImage, err := e.pullManager.GetDockerImage(image, definition.ExecutorOptions.Docker, definition.PullPolicies)
if err != nil {
return nil, err
}
serviceSlug := strings.ReplaceAll(service, "/", "__")
containerName := e.makeContainerName(fmt.Sprintf("%s-%d", serviceSlug, serviceIndex))
// this will fail potentially some builds if there's name collision
_ = e.removeContainer(e.Context, containerName)
config := e.createServiceContainerConfig(service, version, serviceImage.ID, definition)
devices, err := e.getServicesDevices(image)
if err != nil {
return nil, err
}
deviceRequests, err := e.getServicesDeviceRequests()
if err != nil {
return nil, err
}
hostConfig, err := e.createHostConfigForService(e.isInPrivilegedServiceList(definition), devices, deviceRequests)
if err != nil {
return nil, err
}
platform := platformForImage(serviceImage, definition.ExecutorOptions)
networkConfig := e.networkConfig(linkNames)
e.BuildLogger.Debugln("Creating service container", containerName, "...")
resp, err := e.client.ContainerCreate(e.Context, config, hostConfig, networkConfig, platform, containerName)
if err != nil {
return nil, err
}
e.BuildLogger.Debugln(fmt.Sprintf("Starting service container %s (%s)...", containerName, resp.ID))
err = e.client.ContainerStart(e.Context, resp.ID, container.StartOptions{})
if err != nil {
e.temporary = append(e.temporary, resp.ID)
return nil, err
}
return fakeContainer(resp.ID, containerName), nil
}