in executors/docker/executor_docker.go [722:813]
func (s *executor) createContainer(containerType string, imageDefinition common.Image, cmd []string, allowedInternalImages []string) (*types.ContainerJSON, error) {
imageName, err := s.expandImageName(imageDefinition.Name, allowedInternalImages)
if err != nil {
return nil, err
}
// Fetch image
image, err := s.getDockerImage(imageName)
if err != nil {
return nil, err
}
s.printUsedDockerImageID(imageName, image.ID, "container", containerType)
hostname := s.Config.Docker.Hostname
if hostname == "" {
hostname = s.Build.ProjectUniqueName()
}
containerName := s.Build.ProjectUniqueName() + "-" + containerType
config := &container.Config{
Image: image.ID,
Hostname: hostname,
Cmd: cmd,
Labels: s.getLabels(containerType),
Tty: false,
AttachStdin: true,
AttachStdout: true,
AttachStderr: true,
OpenStdin: true,
StdinOnce: true,
Env: append(s.Build.GetAllVariables().StringList(), s.BuildShell.Environment...),
}
if len(imageDefinition.Entrypoint) > 0 {
config.Entrypoint = imageDefinition.Entrypoint
}
nanoCPUs, err := s.Config.Docker.GetNanoCPUs()
if err != nil {
return nil, err
}
hostConfig := &container.HostConfig{
Resources: container.Resources{
CpusetCpus: s.Config.Docker.CPUSetCPUs,
NanoCPUs: nanoCPUs,
Devices: s.devices,
},
DNS: s.Config.Docker.DNS,
DNSSearch: s.Config.Docker.DNSSearch,
Privileged: s.Config.Docker.Privileged,
UsernsMode: container.UsernsMode(s.Config.Docker.UsernsMode),
CapAdd: s.Config.Docker.CapAdd,
CapDrop: s.Config.Docker.CapDrop,
SecurityOpt: s.Config.Docker.SecurityOpt,
RestartPolicy: neverRestartPolicy,
ExtraHosts: s.Config.Docker.ExtraHosts,
NetworkMode: container.NetworkMode(s.Config.Docker.NetworkMode),
Links: append(s.Config.Docker.Links, s.links...),
Binds: s.binds,
ShmSize: s.Config.Docker.ShmSize,
VolumeDriver: s.Config.Docker.VolumeDriver,
VolumesFrom: append(s.Config.Docker.VolumesFrom, s.volumesFrom...),
LogConfig: container.LogConfig{
Type: "json-file",
},
Tmpfs: s.Config.Docker.Tmpfs,
Sysctls: s.Config.Docker.SysCtls,
}
// this will fail potentially some builds if there's name collision
s.removeContainer(s.Context, containerName)
s.Debugln("Creating container", containerName, "...")
resp, err := s.client.ContainerCreate(s.Context, config, hostConfig, nil, containerName)
if err != nil {
if resp.ID != "" {
s.failures = append(s.failures, resp.ID)
}
return nil, err
}
inspect, err := s.client.ContainerInspect(s.Context, resp.ID)
if err != nil {
s.failures = append(s.failures, resp.ID)
return nil, err
}
s.builds = append(s.builds, resp.ID)
return &inspect, nil
}