diff --git a/agent/app/service/container_compose.go b/agent/app/service/container_compose.go index add4433cd..4253a9c74 100644 --- a/agent/app/service/container_compose.go +++ b/agent/app/service/container_compose.go @@ -203,9 +203,8 @@ func (u *ContainerService) CreateCompose(req dto.ComposeCreate) error { } go func() { taskItem.AddSubTask(i18n.GetMsgByKey("ComposeCreate"), func(t *task.Task) error { - cmd := getComposeCmd(req.Path, "up") - out, err := cmd.CombinedOutput() - taskItem.Log(i18n.GetWithName("ComposeCreateRes", string(out))) + err := compose.UpWithTask(req.Path, t) + t.LogWithStatus(i18n.GetMsgByKey("ComposeCreate"), err) if err != nil { _, _ = compose.Down(req.Path) return err diff --git a/agent/utils/compose/compose.go b/agent/utils/compose/compose.go index feb59e717..fd733541a 100644 --- a/agent/utils/compose/compose.go +++ b/agent/utils/compose/compose.go @@ -1,11 +1,21 @@ package compose import ( + "errors" + "fmt" + "os" + "path" + "strings" + "time" + + "github.com/1Panel-dev/1Panel/agent/app/task" "github.com/1Panel-dev/1Panel/agent/buserr" "github.com/1Panel-dev/1Panel/agent/global" + "github.com/1Panel-dev/1Panel/agent/i18n" "github.com/1Panel-dev/1Panel/agent/utils/cmd" "github.com/1Panel-dev/1Panel/agent/utils/common" - "time" + "github.com/1Panel-dev/1Panel/agent/utils/docker" + "github.com/goccy/go-yaml" ) func checkCmd() error { @@ -27,6 +37,58 @@ func Up(filePath string) (string, error) { return stdout, err } +func UpWithTask(filePath string, task *task.Task) error { + content, err := os.ReadFile(filePath) + if err != nil { + return err + } + env, _ := os.ReadFile(path.Join(path.Dir(filePath), ".env")) + var compose docker.ComposeProject + if err := yaml.Unmarshal(content, &compose); err != nil { + return fmt.Errorf("parse docker-compose file failed: %v", err) + } + images, err := docker.GetImagesFromDockerCompose(env, content) + if err != nil { + return err + } + dockerCLi, err := docker.NewClient() + if err != nil { + return err + } + errMsg := "" + for _, image := range images { + task.Log(i18n.GetWithName("PullImageStart", image)) + if err = dockerCLi.PullImageWithProcess(task, image); err != nil { + errOur := err.Error() + if errOur != "" { + if strings.Contains(errOur, "no such host") { + errMsg = i18n.GetMsgByKey("ErrNoSuchHost") + ":" + } + if strings.Contains(errOur, "Error response from daemon") { + errMsg = i18n.GetMsgByKey("PullImageTimeout") + ":" + } + } + message := errMsg + errOur + installErr := errors.New(message) + task.LogFailedWithErr(i18n.GetMsgByKey("PullImage"), installErr) + if exist, _ := dockerCLi.ImageExists(image); !exist { + return installErr + } else { + task.Log(i18n.GetMsgByKey("UseExistImage")) + } + } else { + task.Log(i18n.GetMsgByKey("PullImageSuccess")) + } + } + + dockerCommand := global.CONF.DockerConfig.Command + if dockerCommand == "docker-compose" { + return cmd.NewCommandMgr(cmd.WithTask(*task)).Run("docker-compose", "-f", filePath, "up", "-d") + } else { + return cmd.NewCommandMgr(cmd.WithTask(*task)).Run("docker", "compose", "-f", filePath, "up", "-d") + } +} + func Down(filePath string) (string, error) { if err := checkCmd(); err != nil { return "", err diff --git a/frontend/src/views/container/compose/create/index.vue b/frontend/src/views/container/compose/create/index.vue index 452d80f0e..a245e12da 100644 --- a/frontend/src/views/container/compose/create/index.vue +++ b/frontend/src/views/container/compose/create/index.vue @@ -69,7 +69,12 @@ - + + + {{ $t('commons.table.backToList') }} + {{ $t('commons.table.keepEdit') }} + + @@ -167,8 +172,12 @@ const changeFrom = () => { const handleClose = () => { emit('search'); + taskLogRef.value?.handleClose(); drawerVisible.value = false; }; +const closeTask = () => { + taskLogRef.value?.handleClose(); +}; const loadPath = async () => { const pathRes = await loadBaseDir(); diff --git a/frontend/src/views/container/compose/edit/index.vue b/frontend/src/views/container/compose/edit/index.vue deleted file mode 100644 index 59c72cbae..000000000 --- a/frontend/src/views/container/compose/edit/index.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - {{ $t('container.editComposeHelper') }} - - - - - - - - - {{ $t('commons.button.cancel') }} - - - {{ $t('commons.button.confirm') }} - - - - - - diff --git a/frontend/src/views/container/compose/index.vue b/frontend/src/views/container/compose/index.vue index aebefbedb..96ce3bb13 100644 --- a/frontend/src/views/container/compose/index.vue +++ b/frontend/src/views/container/compose/index.vue @@ -13,14 +13,19 @@ {{ $t('container.createCompose') }} + + + + - + @@ -29,17 +34,32 @@ - + - + {{ row.name }} + + + + {{ loadFrom(row) }} + - + + {{ row.createdAt }} + + + {{ $t('container.exited') }} - - - - {{ loadFrom(row) }} - - {{ row.createdAt }} - + + {{ $t('home.dir') }} + - + - + - +