diff --git a/backend/app/service/container_compose.go b/backend/app/service/container_compose.go index b0d651d4a..9d1e9b891 100644 --- a/backend/app/service/container_compose.go +++ b/backend/app/service/container_compose.go @@ -216,7 +216,8 @@ func (u *ContainerService) ComposeUpdate(req dto.ComposeUpdate) error { if cmd.CheckIllegal(req.Name, req.Path) { return buserr.New(constant.ErrCmdIllegal) } - if _, err := os.Stat(req.Path); err != nil { + oldFile, err := os.ReadFile(req.Path) + if err != nil { return fmt.Errorf("load file with path %s failed, %v", req.Path, err) } file, err := os.OpenFile(req.Path, os.O_WRONLY|os.O_TRUNC, 0640) @@ -230,10 +231,16 @@ func (u *ContainerService) ComposeUpdate(req dto.ComposeUpdate) error { global.LOG.Infof("docker-compose.yml %s has been replaced, now start to docker-compose restart", req.Path) if stdout, err := compose.Down(req.Path); err != nil { - return errors.New(string(stdout)) + if err := recreateCompose(string(oldFile), req.Path); err != nil { + return fmt.Errorf("update failed when handle compose down, err: %s, recreate failed: %v", string(stdout), err) + } + return fmt.Errorf("update failed when handle compose down, err: %s", string(stdout)) } if stdout, err := compose.Up(req.Path); err != nil { - return errors.New(string(stdout)) + if err := recreateCompose(string(oldFile), req.Path); err != nil { + return fmt.Errorf("update failed when handle compose up, err: %s, recreate failed: %v", string(stdout), err) + } + return fmt.Errorf("update failed when handle compose up, err: %s", string(stdout)) } return nil @@ -261,3 +268,19 @@ func (u *ContainerService) loadPath(req *dto.ComposeCreate) error { } return nil } + +func recreateCompose(content, path string) error { + file, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0640) + if err != nil { + return err + } + defer file.Close() + write := bufio.NewWriter(file) + _, _ = write.WriteString(content) + write.Flush() + + if stdout, err := compose.Up(path); err != nil { + return errors.New(string(stdout)) + } + return nil +}