| 327 | var startMx sync.Mutex |
| 328 | |
| 329 | func (s *composeService) createMobyContainer(ctx context.Context, project *types.Project, service types.ServiceConfig, |
| 330 | name string, number int, inherit *container.Summary, opts createOptions, |
| 331 | ) (container.Summary, error) { |
| 332 | var created container.Summary |
| 333 | cfgs, err := s.getCreateConfigs(ctx, project, service, number, inherit, opts) |
| 334 | if err != nil { |
| 335 | return created, err |
| 336 | } |
| 337 | platform := service.Platform |
| 338 | if platform == "" { |
| 339 | platform = project.Environment["DOCKER_DEFAULT_PLATFORM"] |
| 340 | } |
| 341 | var plat *specs.Platform |
| 342 | if platform != "" { |
| 343 | var p specs.Platform |
| 344 | p, err = platforms.Parse(platform) |
| 345 | if err != nil { |
| 346 | return created, err |
| 347 | } |
| 348 | plat = &p |
| 349 | } |
| 350 | |
| 351 | response, err := s.apiClient().ContainerCreate(ctx, client.ContainerCreateOptions{ |
| 352 | Name: name, |
| 353 | Platform: plat, |
| 354 | Config: cfgs.Container, |
| 355 | HostConfig: cfgs.Host, |
| 356 | NetworkingConfig: cfgs.Network, |
| 357 | }) |
| 358 | if err != nil { |
| 359 | return created, err |
| 360 | } |
| 361 | for _, warning := range response.Warnings { |
| 362 | s.events.On(api.Resource{ |
| 363 | ID: service.Name, |
| 364 | Status: api.Warning, |
| 365 | Text: warning, |
| 366 | }) |
| 367 | } |
| 368 | // Starting API version 1.44, the ContainerCreate API call takes multiple networks |
| 369 | // so we include all configurations there and can skip the one-by-one calls here. |
| 370 | // For older API versions (e.g. Docker 20.10/API 1.41, Synology DSM 7.1/7.2), |
| 371 | // extra networks must be connected individually after creation via NetworkConnect. |
| 372 | apiVersion, err := s.RuntimeAPIVersion(ctx) |
| 373 | if err != nil { |
| 374 | return created, err |
| 375 | } |
| 376 | if versions.LessThan(apiVersion, apiVersion144) { |
| 377 | serviceNetworks := service.NetworksByPriority() |
| 378 | for _, networkKey := range serviceNetworks { |
| 379 | mobyNetworkName := project.Networks[networkKey].Name |
| 380 | if string(cfgs.Host.NetworkMode) == mobyNetworkName { |
| 381 | // primary network already configured as part of ContainerCreate |
| 382 | continue |
| 383 | } |
| 384 | epSettings, err := createEndpointSettings(project, service, number, networkKey, cfgs.Links, opts.UseNetworkAliases) |
| 385 | if err != nil { |
| 386 | _, _ = s.apiClient().ContainerRemove(ctx, response.ID, client.ContainerRemoveOptions{Force: true}) |