diff --git a/pkg/compose/watch.go b/pkg/compose/watch.go index 682f14d95..40fe24c9d 100644 --- a/pkg/compose/watch.go +++ b/pkg/compose/watch.go @@ -314,25 +314,50 @@ func (s *composeService) makeSyncFn(ctx context.Context, project *types.Project, case <-ctx.Done(): return nil case opt := <-needSync: - if fi, statErr := os.Stat(opt.HostPath); statErr == nil && !fi.IsDir() { - err := s.Copy(ctx, project.Name, api.CopyOptions{ - Source: opt.HostPath, - Destination: fmt.Sprintf("%s:%s", opt.Service, opt.ContainerPath), - }) - if err != nil { - return err + service, err := project.GetService(opt.Service) + if err != nil { + return err + } + scale := 1 + if service.Deploy != nil && service.Deploy.Replicas != nil { + scale = int(*service.Deploy.Replicas) + } + + if fi, statErr := os.Stat(opt.HostPath); statErr == nil { + if fi.IsDir() { + for i := 1; i <= scale; i++ { + _, err := s.Exec(ctx, project.Name, api.RunOptions{ + Service: opt.Service, + Command: []string{"mkdir", "-p", opt.ContainerPath}, + Index: i, + }) + if err != nil { + logrus.Warnf("failed to create %q from %s: %v", opt.ContainerPath, opt.Service, err) + } + } + fmt.Fprintf(s.stdinfo(), "%s created\n", opt.ContainerPath) + } else { + err := s.Copy(ctx, project.Name, api.CopyOptions{ + Source: opt.HostPath, + Destination: fmt.Sprintf("%s:%s", opt.Service, opt.ContainerPath), + }) + if err != nil { + return err + } + fmt.Fprintf(s.stdinfo(), "%s updated\n", opt.ContainerPath) } - fmt.Fprintf(s.stdinfo(), "%s updated\n", opt.ContainerPath) } else if errors.Is(statErr, fs.ErrNotExist) { - _, err := s.Exec(ctx, project.Name, api.RunOptions{ - Service: opt.Service, - Command: []string{"rm", "-rf", opt.ContainerPath}, - Index: 1, - }) - if err != nil { - logrus.Warnf("failed to delete %q from %s: %v", opt.ContainerPath, opt.Service, err) + for i := 1; i <= scale; i++ { + _, err := s.Exec(ctx, project.Name, api.RunOptions{ + Service: opt.Service, + Command: []string{"rm", "-rf", opt.ContainerPath}, + Index: i, + }) + if err != nil { + logrus.Warnf("failed to delete %q from %s: %v", opt.ContainerPath, opt.Service, err) + } } - fmt.Fprintf(s.stdinfo(), "%s deleted from container\n", opt.ContainerPath) + fmt.Fprintf(s.stdinfo(), "%s deleted from service\n", opt.ContainerPath) } } }