diff --git a/backend/app/service/runtime.go b/backend/app/service/runtime.go index b69588460..dbf37f76e 100644 --- a/backend/app/service/runtime.go +++ b/backend/app/service/runtime.go @@ -98,10 +98,6 @@ func (r *RuntimeService) Create(create request.RuntimeCreate) (err error) { if err != nil { return } - composeService, err := getComposeService(create.Name, newNameDir, composeContent, envContent, false) - if err != nil { - return - } runtime := &model.Runtime{ Name: create.Name, DockerCompose: string(composeContent), @@ -117,7 +113,7 @@ func (r *RuntimeService) Create(create request.RuntimeCreate) (err error) { if err = runtimeRepo.Create(context.Background(), runtime); err != nil { return } - go buildRuntime(runtime, composeService, "") + go buildRuntime(runtime, "") return } @@ -260,7 +256,6 @@ func (r *RuntimeService) Update(req request.RuntimeUpdate) error { if err != nil { return err } - composeService, err := getComposeService(runtime.Name, runtimeDir, composeContent, envContent, false) if err != nil { return err } @@ -277,6 +272,6 @@ func (r *RuntimeService) Update(req request.RuntimeUpdate) error { if err != nil { return err } - go buildRuntime(runtime, composeService, imageID) + go buildRuntime(runtime, imageID) return nil } diff --git a/backend/app/service/runtime_utils.go b/backend/app/service/runtime_utils.go index 322e09910..7b9244dcf 100644 --- a/backend/app/service/runtime_utils.go +++ b/backend/app/service/runtime_utils.go @@ -1,6 +1,7 @@ package service import ( + "bytes" "fmt" "github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/buserr" @@ -8,20 +9,42 @@ import ( "github.com/1Panel-dev/1Panel/backend/global" "github.com/1Panel-dev/1Panel/backend/utils/docker" "github.com/1Panel-dev/1Panel/backend/utils/files" - "github.com/docker/cli/cli/command" "github.com/subosito/gotenv" + "io" "os" + "os/exec" "path" "strings" ) -func buildRuntime(runtime *model.Runtime, service *docker.ComposeService, oldImageID string) { - err := service.ComposeBuild() +func buildRuntime(runtime *model.Runtime, oldImageID string) { + runtimePath := path.Join(constant.RuntimeDir, runtime.Type, runtime.Name) + composePath := path.Join(runtimePath, "docker-compose.yml") + logPath := path.Join(runtimePath, "build.log") + + logFile, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) + if err != nil { + fmt.Println("Failed to open log file:", err) + return + } + defer func() { + _ = logFile.Close() + }() + + cmd := exec.Command("docker-compose", "-f", composePath, "build") + multiWriterStdout := io.MultiWriter(os.Stdout, logFile) + cmd.Stdout = multiWriterStdout + var stderrBuf bytes.Buffer + multiWriterStderr := io.MultiWriter(&stderrBuf, logFile, os.Stderr) + cmd.Stderr = multiWriterStderr + + err = cmd.Run() if err != nil { runtime.Status = constant.RuntimeError - runtime.Message = buserr.New(constant.ErrImageBuildErr).Error() + ":" + err.Error() + runtime.Message = buserr.New(constant.ErrImageBuildErr).Error() + ":" + stderrBuf.String() } else { runtime.Status = constant.RuntimeNormal + runtime.Message = "" if oldImageID != "" { client, err := docker.NewClient() if err == nil { @@ -83,25 +106,3 @@ func handleParams(image, runtimeType, runtimeDir string, params map[string]inter envContent = []byte(envStr) return } - -func getComposeService(name, runtimeDir string, composeFile, env []byte, skipNormalization bool) (*docker.ComposeService, error) { - project, err := docker.GetComposeProject(name, runtimeDir, composeFile, env, skipNormalization) - if err != nil { - return nil, err - } - logPath := path.Join(runtimeDir, "build.log") - fileOp := files.NewFileOp() - if fileOp.Stat(logPath) { - _ = fileOp.DeleteFile(logPath) - } - file, err := os.Create(logPath) - if err != nil { - return nil, err - } - composeService, err := docker.NewComposeService(command.WithOutputStream(file)) - if err != nil { - return nil, err - } - composeService.SetProject(project) - return composeService, nil -}