From 97a4192fca13d4038cf6f24fb8192000cd145bb0 Mon Sep 17 00:00:00 2001 From: CN-Scars Date: Wed, 14 Jan 2026 21:45:24 +0800 Subject: [PATCH 1/3] feat: Support batch import for Docker images --- agent/app/dto/image.go | 4 +- agent/app/service/image.go | 58 +++++++++------- frontend/src/api/interface/container.ts | 2 +- frontend/src/components/file-list/index.vue | 68 ++++++++++++++++--- .../src/views/container/image/load/index.vue | 12 ++-- 5 files changed, 102 insertions(+), 42 deletions(-) diff --git a/agent/app/dto/image.go b/agent/app/dto/image.go index ad2bb8873a54..e8c1daa6d438 100644 --- a/agent/app/dto/image.go +++ b/agent/app/dto/image.go @@ -21,8 +21,8 @@ type ImageInfo struct { } type ImageLoad struct { - TaskID string `json:"taskID"` - Path string `json:"path" validate:"required"` + TaskID string `json:"taskID"` + Paths []string `json:"paths" validate:"required,dive,required"` } type ImageBuild struct { diff --git a/agent/app/service/image.go b/agent/app/service/image.go index 25509cfe9696..46f06bb717c4 100644 --- a/agent/app/service/image.go +++ b/agent/app/service/image.go @@ -321,35 +321,41 @@ func (u *ImageService) ImagePull(req dto.ImagePull) error { } func (u *ImageService) ImageLoad(req dto.ImageLoad) error { - taskItem, err := task.NewTaskWithOps(req.Path, task.TaskImport, task.TaskScopeImage, req.TaskID, 1) + taskItem, err := task.NewTaskWithOps(strings.Join(req.Paths, ","), task.TaskImport, task.TaskScopeImage, req.TaskID, 1) if err != nil { return fmt.Errorf("new task for image import failed, err: %v", err) } - taskItem.AddSubTask(i18n.GetWithName("TaskImport", req.Path), func(t *task.Task) error { - file, err := os.Open(req.Path) - if err != nil { - return err - } - defer file.Close() - client, err := docker.NewDockerClient() - if err != nil { - return err - } - defer client.Close() - res, err := client.ImageLoad(context.TODO(), file) - if err != nil { - return err - } - defer res.Body.Close() - content, err := io.ReadAll(res.Body) - if err != nil { - return err - } - if strings.Contains(string(content), "Error") { - return errors.New(string(content)) - } - return nil - }, nil) + + for _, itemPath := range req.Paths { + currentPath := itemPath + itemName := path.Base(currentPath) + taskItem.AddSubTask(i18n.GetWithName("TaskImport", itemName), func(t *task.Task) error { + taskItem.Logf("----------------- %s -----------------", itemName) + file, err := os.Open(currentPath) + if err != nil { + return err + } + defer file.Close() + client, err := docker.NewDockerClient() + if err != nil { + return err + } + defer client.Close() + res, err := client.ImageLoad(context.TODO(), file) + if err != nil { + return err + } + defer res.Body.Close() + content, err := io.ReadAll(res.Body) + if err != nil { + return err + } + if strings.Contains(string(content), "Error") { + return errors.New(string(content)) + } + return nil + }, nil) + } go func() { _ = taskItem.Execute() }() diff --git a/frontend/src/api/interface/container.ts b/frontend/src/api/interface/container.ts index b440d1fb0958..0e5e4bd7e650 100644 --- a/frontend/src/api/interface/container.ts +++ b/frontend/src/api/interface/container.ts @@ -224,7 +224,7 @@ export namespace Container { } export interface ImageLoad { taskID: string; - path: string; + paths: Array; } export interface ImageSave { taskID: string; diff --git a/frontend/src/components/file-list/index.vue b/frontend/src/components/file-list/index.vue index 24219fa87ef6..071a658a9c0d 100644 --- a/frontend/src/components/file-list/index.vue +++ b/frontend/src/components/file-list/index.vue @@ -105,7 +105,8 @@
-
+ +
{{ $t('file.currentSelect') }} @@ -115,6 +116,24 @@
+ +
+ {{ $t('file.currentSelect') }} + + +
+ {{ item.path }} +
+
+
+