From 02cf2a80cbd78e9059e284ca09d4e781dbc9ca6f Mon Sep 17 00:00:00 2001 From: CityFun <31820853+zhengkunwang223@users.noreply.github.com> Date: Fri, 18 Jul 2025 11:43:23 +0800 Subject: [PATCH] fix: Fixed issue with install Mailserver failed (#9562) Refs https://github.com/1Panel-dev/1Panel/issues/9539 --- agent/app/service/app_utils.go | 4 +- agent/utils/docker/compose.go | 59 ++++++++++++++++++++++++ frontend/src/components/status/index.vue | 6 +-- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/agent/app/service/app_utils.go b/agent/app/service/app_utils.go index 276311a73..68d0cf29b 100644 --- a/agent/app/service/app_utils.go +++ b/agent/app/service/app_utils.go @@ -1025,12 +1025,12 @@ func upApp(task *task.Task, appInstall *model.AppInstall, pullImages bool) error errMsg string ) if pullImages && appInstall.App.Type != "php" { - projectName := strings.ToLower(appInstall.Name) + //projectName := strings.ToLower(appInstall.Name) envByte, err := files.NewFileOp().GetContent(appInstall.GetEnvPath()) if err != nil { return err } - images, err := composeV2.GetDockerComposeImages(projectName, envByte, []byte(appInstall.DockerCompose)) + images, err := composeV2.GetImagesFromDockerCompose(envByte, []byte(appInstall.DockerCompose)) if err != nil { return err } diff --git a/agent/utils/docker/compose.go b/agent/utils/docker/compose.go index 37adab8f6..8a628a758 100644 --- a/agent/utils/docker/compose.go +++ b/agent/utils/docker/compose.go @@ -1,6 +1,8 @@ package docker import ( + "bufio" + "bytes" "context" "fmt" "github.com/compose-spec/compose-go/v2/loader" @@ -152,3 +154,60 @@ func GetDockerComposeImages(projectName string, env, yml []byte) ([]string, erro } return images, nil } + +func GetImagesFromDockerCompose(env, yml []byte) ([]string, error) { + envVars, err := loadEnvFile(env) + if err != nil { + return nil, fmt.Errorf("load env failed: %v", err) + } + + var compose ComposeProject + if err := yaml.Unmarshal(yml, &compose); err != nil { + return nil, fmt.Errorf("parse docker-compose file failed: %v", err) + } + + var images []string + for _, service := range compose.Services { + if service.Image != "" { + resolvedImage := replaceEnvVars(service.Image, envVars) + images = append(images, resolvedImage) + } + } + + return images, nil +} + +func loadEnvFile(env []byte) (map[string]string, error) { + envVars := make(map[string]string) + + scanner := bufio.NewScanner(bytes.NewReader(env)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + if line == "" || strings.HasPrefix(line, "#") { + continue + } + + parts := strings.SplitN(line, "=", 2) + if len(parts) == 2 { + key := strings.TrimSpace(parts[0]) + value := strings.TrimSpace(parts[1]) + value = strings.Trim(value, `"'`) + envVars[key] = value + } + } + + return envVars, scanner.Err() +} + +func replaceEnvVars(input string, envVars map[string]string) string { + re := regexp.MustCompile(`\$\{([^}]+)\}`) + + return re.ReplaceAllStringFunc(input, func(match string) string { + varName := match[2 : len(match)-1] + if value, exists := envVars[varName]; exists { + return value + } + return match + }) +} diff --git a/frontend/src/components/status/index.vue b/frontend/src/components/status/index.vue index c09ef3d05..7118ebf00 100644 --- a/frontend/src/components/status/index.vue +++ b/frontend/src/components/status/index.vue @@ -5,7 +5,7 @@ - {{ $t('commons.status.' + statusItem) }} + {{ $t('commons.status.' + statusItem) }} @@ -15,14 +15,14 @@ - {{ $t('commons.status.' + statusItem) }} + {{ $t('commons.status.' + statusItem) }} - {{ $t('commons.status.' + statusItem) }} + {{ $t('commons.status.' + statusItem) }}