func createComposeServices()

in ecs-cli/modules/cli/local/converter/converter.go [123:180]


func createComposeServices(taskDefinition *ecs.TaskDefinition, metadata *LocalCreateMetadata) ([]composeV3.ServiceConfig, error) {
	networkMode := aws.StringValue(taskDefinition.NetworkMode)
	if networkMode != "" {
		log.WithFields(log.Fields{
			"networkMode": networkMode,
		}).Info("Task Definition network mode is ignored when running containers locally. Tasks will be run in the ecs-local-network.")
	}

	pid := aws.StringValue(taskDefinition.PidMode)
	ipc := aws.StringValue(taskDefinition.IpcMode)

	if pid != "" && pid != ecs.PidModeHost {
		log.WithFields(log.Fields{
			"pid": pid,
		}).Info("PID mode can only be set to 'host' when running tasks locally.")
		pid = "" // set to empty
	}

	if ipc != "" && ipc != ecs.IpcModeHost && ipc != ecs.IpcModeNone {
		log.WithFields(log.Fields{
			"ipc": ipc,
		}).Info("IPC mode can only be set to 'host' or 'none' when running tasks locally.")
		ipc = "" // set to empty
	}

	commonValues := &CommonContainerValues{
		Pid:     pid,
		Ipc:     ipc,
		Volumes: taskDefinition.Volumes,
		Creds:   resolveCredentials(aws.StringValue(taskDefinition.TaskRoleArn), metadata.UseRole),
	}

	if len(taskDefinition.ContainerDefinitions) < 1 {
		return nil, fmt.Errorf("task definition must include at least one container definition")
	}

	var services []composeV3.ServiceConfig

	for _, containerDefinition := range taskDefinition.ContainerDefinitions {
		service, err := convertToComposeService(containerDefinition, commonValues)
		if err != nil {
			return nil, err
		}
		services = append(services, service)
	}

	// NOTE metadata should always be set on project when task definition is read
	if metadata == nil {
		return nil, fmt.Errorf("Unable to set service labels")
	}

	for _, service := range services {
		service.Labels[TaskDefinitionLabelType] = metadata.InputType
		service.Labels[TaskDefinitionLabelValue] = metadata.Value
	}

	return services, nil
}