MCPcopy
hub / github.com/docker/compose / createMobyContainer

Method createMobyContainer

pkg/compose/convergence.go:329–413  ·  pkg/compose/convergence.go::composeService.createMobyContainer
(ctx context.Context, project *types.Project, service types.ServiceConfig,
	name string, number int, inherit *container.Summary, opts createOptions,
)

Source from the content-addressed store, hash-verified

327var startMx sync.Mutex
328
329func (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})

Calls 9

getCreateConfigsMethod · 0.95
apiClientMethod · 0.95
RuntimeAPIVersionMethod · 0.95
createEndpointSettingsFunction · 0.85
OnMethod · 0.65
ContainerCreateMethod · 0.45
ContainerRemoveMethod · 0.45
NetworkConnectMethod · 0.45
ContainerInspectMethod · 0.45