|
|
@@ -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 {
|
|
|
- return "", err
|
|
|
- }
|
|
|
- if err = s.ensureImagesExists(ctx, project); err != nil {
|
|
|
- return "", err
|
|
|
- }
|
|
|
- if err := s.ensureProjectNetworks(ctx, project); err != nil {
|
|
|
- return "", err
|
|
|
+ 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
|
|
|
+ }
|
|
|
}
|
|
|
- if err := s.ensureProjectVolumes(ctx, project); err != nil {
|
|
|
+ project.Services = types.Services(dependencies)
|
|
|
+ if err := s.Create(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)
|
|
|
-}
|