diff --git a/backend/app/api/v1/container.go b/backend/app/api/v1/container.go index 2d78af06a..753ed4a7d 100644 --- a/backend/app/api/v1/container.go +++ b/backend/app/api/v1/container.go @@ -90,11 +90,12 @@ func (b *BaseApi) CreateCompose(c *gin.Context) { return } - if err := containerService.CreateCompose(req); err != nil { + log, err := containerService.CreateCompose(req) + if err != nil { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return } - helper.SuccessWithData(c, nil) + helper.SuccessWithData(c, log) } // @Tags Container Compose diff --git a/backend/app/service/container.go b/backend/app/service/container.go index 9f54045a1..375cd0c8b 100644 --- a/backend/app/service/container.go +++ b/backend/app/service/container.go @@ -33,7 +33,7 @@ type IContainerService interface { PageVolume(req dto.SearchWithPage) (int64, interface{}, error) ListVolume() ([]dto.Options, error) PageCompose(req dto.SearchWithPage) (int64, interface{}, error) - CreateCompose(req dto.ComposeCreate) error + CreateCompose(req dto.ComposeCreate) (string, error) ComposeOperation(req dto.ComposeOperation) error ContainerCreate(req dto.ContainerCreate) error ContainerOperation(req dto.ContainerOperation) error diff --git a/backend/app/service/container_compose.go b/backend/app/service/container_compose.go index 6371aa726..3e1321bed 100644 --- a/backend/app/service/container_compose.go +++ b/backend/app/service/container_compose.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "os" + "os/exec" "path" "sort" "strings" @@ -124,11 +125,11 @@ func (u *ContainerService) PageCompose(req dto.SearchWithPage) (int64, interface return int64(total), BackDatas, nil } -func (u *ContainerService) CreateCompose(req dto.ComposeCreate) error { +func (u *ContainerService) CreateCompose(req dto.ComposeCreate) (string, error) { if req.From == "template" { template, err := composeRepo.Get(commonRepo.WithByID(req.Template)) if err != nil { - return err + return "", err } req.From = "edit" req.File = template.Content @@ -137,14 +138,14 @@ func (u *ContainerService) CreateCompose(req dto.ComposeCreate) error { dir := fmt.Sprintf("%s/docker/compose/%s", constant.DataDir, req.Name) if _, err := os.Stat(dir); err != nil && os.IsNotExist(err) { if err = os.MkdirAll(dir, os.ModePerm); err != nil { - return err + return "", err } } path := fmt.Sprintf("%s/docker-compose.yml", dir) file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { - return err + return "", err } defer file.Close() write := bufio.NewWriter(file) @@ -157,13 +158,28 @@ func (u *ContainerService) CreateCompose(req dto.ComposeCreate) error { if req.From == "path" { req.Name = path.Base(strings.ReplaceAll(req.Path, "/docker-compose.yml", "")) } - if stdout, err := compose.Up(req.Path); err != nil { - _, _ = compose.Down(req.Path) - return errors.New(stdout) + logName := strings.ReplaceAll(req.Path, "docker-compose.yml", "compose.log") + file, err := os.OpenFile(logName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return "", err } - _ = composeRepo.CreateRecord(&model.Compose{Name: req.Name}) + go func() { + defer file.Close() + cmd := exec.Command("docker-compose", "-f", req.Path, "up", "-d") + stdout, err := cmd.CombinedOutput() + _, _ = file.Write(stdout) + if err != nil { + global.LOG.Errorf("docker-compose up %s failed, err: %v", req.Name, err) + _, _ = compose.Down(req.Path) + _, _ = file.WriteString("docker-compose up failed!") + return + } + global.LOG.Infof("docker-compose up %s successful!", req.Name) + _ = composeRepo.CreateRecord(&model.Compose{Name: req.Name}) + _, _ = file.WriteString("docker-compose up successful!") + }() - return nil + return logName, nil } func (u *ContainerService) ComposeOperation(req dto.ComposeOperation) error { diff --git a/backend/utils/compose/compose.go b/backend/utils/compose/compose.go index 44a2c3520..b990275f0 100644 --- a/backend/utils/compose/compose.go +++ b/backend/utils/compose/compose.go @@ -7,7 +7,7 @@ import ( ) func Up(filePath string) (string, error) { - stdout, err := cmd.Execf("docker-compose -f %s up -d --quiet-pull", filePath) + stdout, err := cmd.Execf("docker-compose -f %s up -d", filePath) return stdout, err } diff --git a/frontend/src/api/modules/container.ts b/frontend/src/api/modules/container.ts index 18a7b02fb..43ece62e9 100644 --- a/frontend/src/api/modules/container.ts +++ b/frontend/src/api/modules/container.ts @@ -117,7 +117,7 @@ export const searchCompose = (params: SearchWithPage) => { return http.post>(`/containers/compose/search`, params); }; export const upCompose = (params: Container.ComposeCreate) => { - return http.post(`/containers/compose`, params, 600000); + return http.post(`/containers/compose`, params, 600000); }; export const composeOperator = (params: Container.ComposeOpration) => { return http.post(`/containers/compose/operate`, params); diff --git a/frontend/src/views/container/compose/create/index.vue b/frontend/src/views/container/compose/create/index.vue index 7a542f530..8f7baac8f 100644 --- a/frontend/src/views/container/compose/create/index.vue +++ b/frontend/src/views/container/compose/create/index.vue @@ -1,12 +1,18 @@