diff --git a/local/compose/create.go b/local/compose/create.go index 18fa1b535..6cccef1ca 100644 --- a/local/compose/create.go +++ b/local/compose/create.go @@ -48,7 +48,7 @@ func (s *composeService) Create(ctx context.Context, project *types.Project) err return err } - if err := s.ensureProjectNetworks(ctx, project); err != nil { + if err := s.ensureProjectVolumes(ctx, project); err != nil { return err } diff --git a/local/compose/run.go b/local/compose/run.go index a1b5ef6bd..77682ff1e 100644 --- a/local/compose/run.go +++ b/local/compose/run.go @@ -30,31 +30,36 @@ import ( ) func (s *composeService) CreateOneOffContainer(ctx context.Context, project *types.Project, opts compose.RunOptions) (string, error) { - service, err := project.GetService(opts.Name) - if err != nil { + originalServices := project.Services + dependencies := []types.ServiceConfig{} + var requestedService types.ServiceConfig + for _, service := range originalServices { + if service.Name != opts.Name { + dependencies = append(dependencies, service) + } else { + requestedService = service + } + } + project.Services = types.Services(dependencies) + if err := s.Create(ctx, project); err != nil { return "", err } - if err = s.ensureImagesExists(ctx, project); err != nil { - return "", err - } - if err := s.ensureProjectNetworks(ctx, project); err != nil { - return "", err - } - if err := s.ensureProjectVolumes(ctx, project); err != nil { - return "", err - } - if err = s.ensureRequiredServices(ctx, project, service); err != nil { + if err := s.Start(ctx, project, nil); err != nil { return "", err } - updateOneOffServiceConfig(&service, project.Name, opts) + project.Services = originalServices + updateOneOffServiceConfig(&requestedService, project.Name, opts) - err = s.createContainer(ctx, project, service, service.ContainerName, 1) + if err := s.waitDependencies(ctx, project, requestedService); err != nil { + return "", err + } + err := s.createContainer(ctx, project, requestedService, requestedService.ContainerName, 1) if err != nil { return "", err } - return service.ContainerName, err + return requestedService.ContainerName, err } func (s *composeService) Run(ctx context.Context, container string, detach bool) error { @@ -126,16 +131,3 @@ func updateOneOffServiceConfig(service *types.ServiceConfig, projectName string, service.Tty = true service.StdinOpen = true } - -func (s *composeService) ensureRequiredServices(ctx context.Context, project *types.Project, service types.ServiceConfig) error { - err := InDependencyOrder(ctx, project, func(c context.Context, svc types.ServiceConfig) error { - if svc.Name != service.Name { // only start dependencies, not service to run one-off - return s.ensureService(c, project, svc) - } - return nil - }) - if err != nil { - return err - } - return s.Start(ctx, project, nil) -}