in executors/docker/executor_docker.go [557:616]
func (s *executor) createService(serviceIndex int, service, version, image string, serviceDefinition common.Image) (*types.Container, error) {
if len(service) == 0 {
return nil, errors.New("invalid service name")
}
s.Println("Starting service", service+":"+version, "...")
serviceImage, err := s.getDockerImage(image)
if err != nil {
return nil, err
}
s.printUsedDockerImageID(image, serviceImage.ID, "service", service)
serviceSlug := strings.Replace(service, "/", "__", -1)
containerName := fmt.Sprintf("%s-%s-%d", s.Build.ProjectUniqueName(), serviceSlug, serviceIndex)
// this will fail potentially some builds if there's name collision
s.removeContainer(s.Context, containerName)
config := &container.Config{
Image: serviceImage.ID,
Labels: s.getLabels("service", "service="+service, "service.version="+version),
Env: s.getServiceVariables(),
}
if len(serviceDefinition.Command) > 0 {
config.Cmd = serviceDefinition.Command
}
if len(serviceDefinition.Entrypoint) > 0 {
config.Entrypoint = serviceDefinition.Entrypoint
}
hostConfig := &container.HostConfig{
RestartPolicy: neverRestartPolicy,
Privileged: s.Config.Docker.Privileged,
NetworkMode: container.NetworkMode(s.Config.Docker.NetworkMode),
Binds: s.binds,
ShmSize: s.Config.Docker.ShmSize,
VolumesFrom: s.volumesFrom,
Tmpfs: s.Config.Docker.ServicesTmpfs,
LogConfig: container.LogConfig{
Type: "json-file",
},
}
s.Debugln("Creating service container", containerName, "...")
resp, err := s.client.ContainerCreate(s.Context, config, hostConfig, nil, containerName)
if err != nil {
return nil, err
}
s.Debugln("Starting service container", resp.ID, "...")
err = s.client.ContainerStart(s.Context, resp.ID, types.ContainerStartOptions{})
if err != nil {
s.failures = append(s.failures, resp.ID)
return nil, err
}
return fakeContainer(resp.ID, containerName), nil
}