From f50c473cf614b68ec68f51cd6b898b049d859311 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Thu, 17 Oct 2024 15:27:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=B9=E5=99=A8=E9=95=9C=E5=83=8F?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E9=80=89=E5=88=A0=E9=99=A4=20(#6748?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs #6562 --- agent/app/api/v2/image.go | 5 +- agent/app/service/container.go | 21 ++- agent/app/service/image.go | 21 ++- frontend/src/api/modules/container.ts | 2 +- .../src/views/container/image/prune/index.vue | 145 ++++++++++++------ 5 files changed, 139 insertions(+), 55 deletions(-) diff --git a/agent/app/api/v2/image.go b/agent/app/api/v2/image.go index a906f4366..cb41bd5b8 100644 --- a/agent/app/api/v2/image.go +++ b/agent/app/api/v2/image.go @@ -150,12 +150,13 @@ func (b *BaseApi) ImageRemove(c *gin.Context) { return } - if err := imageService.ImageRemove(req); err != nil { + data, err := imageService.ImageRemove(req) + if err != nil { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return } - helper.SuccessWithData(c, nil) + helper.SuccessWithData(c, data) } // @Tags Container Image diff --git a/agent/app/service/container.go b/agent/app/service/container.go index 07592bd17..fc1f61a52 100644 --- a/agent/app/service/container.go +++ b/agent/app/service/container.go @@ -319,13 +319,30 @@ func (u *ContainerService) ContainerCreateByCommand(req dto.ContainerCreateByCom if cmd.CheckIllegal(req.Command) { return buserr.New(constant.ErrCmdIllegal) } - taskItem, err := task.NewTaskWithOps("-", task.TaskCreate, task.TaskScopeContainer, req.TaskID, 1) + if !strings.HasPrefix(strings.TrimSpace(req.Command), "docker run ") { + return errors.New("error command format") + } + containerName := "" + commands := strings.Split(req.Command, " ") + for index, val := range commands { + if val == "--name" && len(commands) > index+1 { + containerName = commands[index+1] + } + } + if !strings.Contains(req.Command, " -d ") { + req.Command = strings.ReplaceAll(req.Command, "docker run", "docker run -d") + } + if len(containerName) == 0 { + containerName = fmt.Sprintf("1Panel-%s-%s", common.RandStr(5), common.RandStrAndNum(4)) + req.Command += fmt.Sprintf(" --name %s", containerName) + } + taskItem, err := task.NewTaskWithOps(containerName, task.TaskCreate, task.TaskScopeContainer, req.TaskID, 1) if err != nil { global.LOG.Errorf("new task for create container failed, err: %v", err) return err } go func() { - taskItem.AddSubTask(i18n.GetWithName("ContainerCreate", "-"), func(t *task.Task) error { + taskItem.AddSubTask(i18n.GetWithName("ContainerCreate", containerName), func(t *task.Task) error { logPath := path.Join(constant.LogDir, task.TaskScopeContainer, req.TaskID+".log") return cmd.ExecShell(logPath, 5*time.Minute, "bash", "-c", req.Command) }, nil) diff --git a/agent/app/service/image.go b/agent/app/service/image.go index 3aa7a4e9f..a70f28e76 100644 --- a/agent/app/service/image.go +++ b/agent/app/service/image.go @@ -40,7 +40,7 @@ type IImageService interface { ImageLoad(req dto.ImageLoad) error ImageSave(req dto.ImageSave) error ImagePush(req dto.ImagePush) error - ImageRemove(req dto.BatchDelete) error + ImageRemove(req dto.BatchDelete) (dto.ContainerPruneReport, error) ImageTag(req dto.ImageTag) error } @@ -399,24 +399,31 @@ func (u *ImageService) ImagePush(req dto.ImagePush) error { return nil } -func (u *ImageService) ImageRemove(req dto.BatchDelete) error { +func (u *ImageService) ImageRemove(req dto.BatchDelete) (dto.ContainerPruneReport, error) { + report := dto.ContainerPruneReport{} client, err := docker.NewDockerClient() if err != nil { - return err + return report, err } defer client.Close() for _, id := range req.Names { + imageItem, _, err := client.ImageInspectWithRaw(context.TODO(), id) + if err != nil { + return report, err + } if _, err := client.ImageRemove(context.TODO(), id, image.RemoveOptions{Force: req.Force, PruneChildren: true}); err != nil { if strings.Contains(err.Error(), "image is being used") || strings.Contains(err.Error(), "is using") { if strings.Contains(id, "sha256:") { - return buserr.New(constant.ErrObjectInUsed) + return report, buserr.New(constant.ErrObjectInUsed) } - return buserr.WithDetail(constant.ErrInUsed, id, nil) + return report, buserr.WithDetail(constant.ErrInUsed, id, nil) } - return err + return report, err } + report.DeletedNumber++ + report.SpaceReclaimed += int(imageItem.Size) } - return nil + return report, nil } func formatFileSize(fileSize int64) (size string) { diff --git a/frontend/src/api/modules/container.ts b/frontend/src/api/modules/container.ts index 51c17e5d9..accbb9e24 100644 --- a/frontend/src/api/modules/container.ts +++ b/frontend/src/api/modules/container.ts @@ -94,7 +94,7 @@ export const imageTag = (params: Container.ImageTag) => { return http.post(`/containers/image/tag`, params); }; export const imageRemove = (params: Container.BatchDelete) => { - return http.post(`/containers/image/remove`, params); + return http.post(`/containers/image/remove`, params); }; // network diff --git a/frontend/src/views/container/image/prune/index.vue b/frontend/src/views/container/image/prune/index.vue index 4785a45bb..0977c6543 100644 --- a/frontend/src/views/container/image/prune/index.vue +++ b/frontend/src/views/container/image/prune/index.vue @@ -1,67 +1,63 @@