diff --git a/agent/app/api/v2/container.go b/agent/app/api/v2/container.go index cee1ce839..c25e05209 100644 --- a/agent/app/api/v2/container.go +++ b/agent/app/api/v2/container.go @@ -315,7 +315,7 @@ func (b *BaseApi) ContainerUpgrade(c *gin.Context) { // @Summary Clean container // @Accept json // @Param request body dto.ContainerPrune true "request" -// @Success 200 {object} dto.ContainerPruneReport +// @Success 200 // @Security ApiKeyAuth // @Security Timestamp // @Router /containers/prune [post] @@ -326,12 +326,11 @@ func (b *BaseApi) ContainerPrune(c *gin.Context) { return } - report, err := containerService.Prune(req) - if err != nil { + if err := containerService.Prune(req); err != nil { helper.InternalServer(c, err) return } - helper.SuccessWithData(c, report) + helper.Success(c) } // @Tags Container diff --git a/agent/app/api/v2/image.go b/agent/app/api/v2/image.go index a55cef39e..610642b3f 100644 --- a/agent/app/api/v2/image.go +++ b/agent/app/api/v2/image.go @@ -138,7 +138,7 @@ func (b *BaseApi) ImagePush(c *gin.Context) { // @Summary Delete image // @Accept json // @Param request body dto.BatchDelete true "request" -// @Success 200 {object} dto.ContainerPruneReport +// @Success 200 // @Security ApiKeyAuth // @Security Timestamp // @Router /containers/image/remove [post] @@ -149,13 +149,12 @@ func (b *BaseApi) ImageRemove(c *gin.Context) { return } - data, err := imageService.ImageRemove(req) - if err != nil { + if err := imageService.ImageRemove(req); err != nil { helper.InternalServer(c, err) return } - helper.SuccessWithData(c, data) + helper.Success(c) } // @Tags Container Image diff --git a/agent/app/dto/container.go b/agent/app/dto/container.go index e20df1e90..0a8ddbc33 100644 --- a/agent/app/dto/container.go +++ b/agent/app/dto/container.go @@ -174,15 +174,11 @@ type ContainerCommit struct { } type ContainerPrune struct { + TaskID string `json:"taskID"` PruneType string `json:"pruneType" validate:"required,oneof=container image volume network buildcache"` WithTagAll bool `json:"withTagAll"` } -type ContainerPruneReport struct { - DeletedNumber int `json:"deletedNumber"` - SpaceReclaimed int `json:"spaceReclaimed"` -} - type Network struct { ID string `json:"id"` Name string `json:"name"` @@ -227,8 +223,9 @@ type VolumeCreate struct { } type BatchDelete struct { - Force bool `json:"force"` - Names []string `json:"names" validate:"required"` + TaskID string `json:"taskID"` + Force bool `json:"force"` + Names []string `json:"names" validate:"required"` } type ComposeInfo struct { diff --git a/agent/app/service/container.go b/agent/app/service/container.go index fae2133f2..2cbb6e8de 100644 --- a/agent/app/service/container.go +++ b/agent/app/service/container.go @@ -82,7 +82,7 @@ type IContainerService interface { CreateVolume(req dto.VolumeCreate) error TestCompose(req dto.ComposeCreate) (bool, error) ComposeUpdate(req dto.ComposeUpdate) error - Prune(req dto.ContainerPrune) (dto.ContainerPruneReport, error) + Prune(req dto.ContainerPrune) error LoadUsers(req dto.OperationWithName) []string @@ -417,66 +417,93 @@ func (u *ContainerService) Inspect(req dto.InspectReq) (string, error) { return string(bytes), nil } -func (u *ContainerService) Prune(req dto.ContainerPrune) (dto.ContainerPruneReport, error) { - report := dto.ContainerPruneReport{} +func (u *ContainerService) Prune(req dto.ContainerPrune) error { client, err := docker.NewDockerClient() if err != nil { - return report, err + return err } defer client.Close() - pruneFilters := filters.NewArgs() - if req.WithTagAll { - pruneFilters.Add("dangling", "false") - if req.PruneType != "image" { - pruneFilters.Add("until", "24h") - } - } + name := "" switch req.PruneType { case "container": - rep, err := client.ContainersPrune(context.Background(), pruneFilters) - if err != nil { - return report, err - } - report.DeletedNumber = len(rep.ContainersDeleted) - report.SpaceReclaimed = int(rep.SpaceReclaimed) + name = "Container" case "image": - rep, err := client.ImagesPrune(context.Background(), pruneFilters) - if err != nil { - return report, err - } - report.DeletedNumber = len(rep.ImagesDeleted) - report.SpaceReclaimed = int(rep.SpaceReclaimed) - case "network": - rep, err := client.NetworksPrune(context.Background(), pruneFilters) - if err != nil { - return report, err - } - report.DeletedNumber = len(rep.NetworksDeleted) + name = "Image" case "volume": - versions, err := client.ServerVersion(context.Background()) - if err != nil { - return report, err - } - if common.ComparePanelVersion(versions.APIVersion, "1.42") { - pruneFilters.Add("all", "true") - } - rep, err := client.VolumesPrune(context.Background(), pruneFilters) - if err != nil { - return report, err - } - report.DeletedNumber = len(rep.VolumesDeleted) - report.SpaceReclaimed = int(rep.SpaceReclaimed) + name = "Volume" case "buildcache": - opts := build.CachePruneOptions{} - opts.All = true - rep, err := client.BuildCachePrune(context.Background(), opts) - if err != nil { - return report, err - } - report.DeletedNumber = len(rep.CachesDeleted) - report.SpaceReclaimed = int(rep.SpaceReclaimed) + name = "BuildCache" + case "network": + name = "Network" } - return report, nil + taskItem, err := task.NewTaskWithOps(i18n.GetMsgByKey(name), task.TaskClean, task.TaskScopeContainer, req.TaskID, 1) + if err != nil { + global.LOG.Errorf("new task for create container failed, err: %v", err) + return err + } + + taskItem.AddSubTask(i18n.GetMsgByKey("TaskClean"), func(t *task.Task) error { + pruneFilters := filters.NewArgs() + if req.WithTagAll { + pruneFilters.Add("dangling", "false") + if req.PruneType != "image" { + pruneFilters.Add("until", "24h") + } + } + DeletedNumber := 0 + SpaceReclaimed := 0 + switch req.PruneType { + case "container": + rep, err := client.ContainersPrune(context.Background(), pruneFilters) + if err != nil { + return err + } + DeletedNumber = len(rep.ContainersDeleted) + SpaceReclaimed = int(rep.SpaceReclaimed) + case "image": + rep, err := client.ImagesPrune(context.Background(), pruneFilters) + if err != nil { + return err + } + DeletedNumber = len(rep.ImagesDeleted) + SpaceReclaimed = int(rep.SpaceReclaimed) + case "network": + rep, err := client.NetworksPrune(context.Background(), pruneFilters) + if err != nil { + return err + } + DeletedNumber = len(rep.NetworksDeleted) + case "volume": + versions, err := client.ServerVersion(context.Background()) + if err != nil { + return err + } + if common.ComparePanelVersion(versions.APIVersion, "1.42") { + pruneFilters.Add("all", "true") + } + rep, err := client.VolumesPrune(context.Background(), pruneFilters) + if err != nil { + return err + } + DeletedNumber = len(rep.VolumesDeleted) + SpaceReclaimed = int(rep.SpaceReclaimed) + case "buildcache": + opts := build.CachePruneOptions{} + opts.All = true + rep, err := client.BuildCachePrune(context.Background(), opts) + if err != nil { + return err + } + DeletedNumber = len(rep.CachesDeleted) + SpaceReclaimed = int(rep.SpaceReclaimed) + } + taskItem.Log(i18n.GetMsgWithMap("PruneHelper", map[string]interface{}{"name": i18n.GetMsgByKey(name), "count": DeletedNumber, "size": common.LoadSizeUnit2F(float64(SpaceReclaimed))})) + return nil + }, nil) + go func() { + _ = taskItem.Execute() + }() + return nil } func (u *ContainerService) LoadResourceLimit() (*dto.ResourceLimit, error) { @@ -1241,29 +1268,29 @@ func checkImageExist(client *client.Client, imageItem string) bool { } func checkImageLike(client *client.Client, imageName string) bool { - if client == nil { - var err error - client, err = docker.NewDockerClient() - if err != nil { - return false - } - } - images, err := client.ImageList(context.Background(), image.ListOptions{}) - if err != nil { - return false - } + if client == nil { + var err error + client, err = docker.NewDockerClient() + if err != nil { + return false + } + } + images, err := client.ImageList(context.Background(), image.ListOptions{}) + if err != nil { + return false + } - for _, img := range images { - for _, tag := range img.RepoTags { - parts := strings.Split(tag, "/") - imageNameWithTag := parts[len(parts)-1] + for _, img := range images { + for _, tag := range img.RepoTags { + parts := strings.Split(tag, "/") + imageNameWithTag := parts[len(parts)-1] - if imageNameWithTag == imageName { - return true - } - } - } - return false + if imageNameWithTag == imageName { + return true + } + } + } + return false } func pullImages(task *task.Task, client *client.Client, imageName string) error { diff --git a/agent/app/service/image.go b/agent/app/service/image.go index 1cd42746a..9c4d97672 100644 --- a/agent/app/service/image.go +++ b/agent/app/service/image.go @@ -21,6 +21,7 @@ import ( "github.com/1Panel-dev/1Panel/agent/constant" "github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/i18n" + "github.com/1Panel-dev/1Panel/agent/utils/common" "github.com/1Panel-dev/1Panel/agent/utils/docker" "github.com/docker/docker/api/types/build" "github.com/docker/docker/api/types/container" @@ -41,7 +42,7 @@ type IImageService interface { ImageLoad(req dto.ImageLoad) error ImageSave(req dto.ImageSave) error ImagePush(req dto.ImagePush) error - ImageRemove(req dto.BatchDelete) (dto.ContainerPruneReport, error) + ImageRemove(req dto.BatchDelete) error ImageTag(req dto.ImageTag) error } @@ -386,34 +387,44 @@ func (u *ImageService) ImagePush(req dto.ImagePush) error { return nil } -func (u *ImageService) ImageRemove(req dto.BatchDelete) (dto.ContainerPruneReport, error) { - report := dto.ContainerPruneReport{} +func (u *ImageService) ImageRemove(req dto.BatchDelete) error { client, err := docker.NewDockerClient() if err != nil { - return report, err + return 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 report, buserr.New("ErrObjectInUsed") - } - return report, buserr.WithDetail("ErrInUsed", id, nil) - } - if strings.Contains(err.Error(), "image has dependent") { - return report, buserr.New("ErrObjectBeDependent") - } - return report, err - } - report.DeletedNumber++ - report.SpaceReclaimed += int(imageItem.Size) + taskItem, err := task.NewTaskWithOps(task.TaskScopeImage, task.TaskDelete, task.TaskScopeContainer, req.TaskID, 1) + if err != nil { + global.LOG.Errorf("new task for create container failed, err: %v", err) + return err } - return report, nil + + for _, id := range req.Names { + taskItem.AddSubTask(i18n.GetMsgByKey("TaskDelete")+id, func(t *task.Task) error { + imageItem, err := client.ImageInspect(context.TODO(), id) + if err != nil { + return 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("ErrObjectInUsed") + } + return buserr.WithDetail("ErrInUsed", id, nil) + } + if strings.Contains(err.Error(), "image has dependent") { + return buserr.New("ErrObjectBeDependent") + } + return err + } + taskItem.Log(i18n.GetMsgWithMap("ImageRemoveHelper", map[string]interface{}{"name": id, "size": common.LoadSizeUnit2F(float64(imageItem.Size))})) + return nil + }, nil) + } + go func() { + _ = taskItem.Execute() + }() + return nil } func formatFileSize(fileSize int64) (size string) { diff --git a/agent/app/task/task.go b/agent/app/task/task.go index 6378277af..aa42ef407 100644 --- a/agent/app/task/task.go +++ b/agent/app/task/task.go @@ -65,6 +65,7 @@ const ( TaskPull = "TaskPull" TaskCommit = "TaskCommit" TaskPush = "TaskPush" + TaskClean = "TaskClean" TaskHandle = "TaskHandle" ) diff --git a/agent/i18n/lang/en.yaml b/agent/i18n/lang/en.yaml index 4ecd2cff6..cc4130db4 100644 --- a/agent/i18n/lang/en.yaml +++ b/agent/i18n/lang/en.yaml @@ -173,6 +173,11 @@ ErrObjectInUsed: 'The object is in use and cannot be deleted' ErrObjectBeDependent: 'This image depends on other images and cannot be deleted' ErrPortRules: 'Port number does not match, please re-enter!' ErrPgImagePull: 'Image pull timed out, please configure image acceleration or manually pull the {{ .name }} image and try again' +PruneHelper: "This cleanup removed {{ .name }} {{ .count }} items, freeing {{ .size }} disk space" +ImageRemoveHelper: "Deleted image {{ .name }}, freeing {{ .size }} disk space" +BuildCache: "Build cache" +Volume: "Storage volume" +Network: "Network" #runtime ErrFileNotExist: '{{ .detail }} file does not exist! Please check the integrity of the source file!' @@ -290,6 +295,7 @@ TaskPull: 'Pull' TaskCommit: 'Commit' TaskBuild: 'Build' TaskPush: 'Push' +TaskClean: "Cleanup" TaskHandle: 'Execute' Website: 'Website' App: 'Application' diff --git a/agent/i18n/lang/ja.yaml b/agent/i18n/lang/ja.yaml index 22eb8141c..f738af6fa 100644 --- a/agent/i18n/lang/ja.yaml +++ b/agent/i18n/lang/ja.yaml @@ -173,6 +173,11 @@ ErrObjectInUsed: 'オブジェクトは使用中のため削除できません' ErrObjectBeDependent: 'このイメージは他のイメージに依存しているため、削除できません' ErrPortRules: 'ポート番号が一致しません。再入力してください。' ErrPgImagePull: 'イメージのプルがタイムアウトしました。イメージのアクセラレーションを設定するか、{{ .name }} イメージを手動でプルして再試行してください' +PruneHelper: "今回のクリーンアップで{{ .name }} {{ .count }}個を削除し、{{ .size }}のディスク領域を解放しました" +ImageRemoveHelper: "イメージ{{ .name }}を削除し、{{ .size }}のディスク領域を解放しました" +BuildCache: "ビルドキャッシュ" +Volume: "ストレージボリューム" +Network: "ネットワーク" #runtime ErrFileNotExist: '{{ .detail }} ファイルが存在しません。ソース ファイルの整合性を確認してください。' @@ -290,6 +295,7 @@ TaskPull: 'プル' TaskCommit: 'コミット' TaskBuild: 'ビルド' TaskPush: 'プッシュ' +TaskClean: "クリーンアップ" TaskHandle: '実行' Website: 'ウェブサイト' App: 'アプリケーション' diff --git a/agent/i18n/lang/ko.yaml b/agent/i18n/lang/ko.yaml index 29b9a1324..2bdcf3099 100644 --- a/agent/i18n/lang/ko.yaml +++ b/agent/i18n/lang/ko.yaml @@ -173,6 +173,11 @@ ErrObjectInUsed: '개체가 사용 중이므로 삭제할 수 없습니다' ErrObjectBeDependent: '이 이미지는 다른 이미지에 의존하므로 삭제할 수 없습니다' ErrPortRules: '포트 번호가 일치하지 않습니다. 다시 입력하세요!' ErrPgImagePull: '이미지 풀링 시간이 초과되었습니다. 이미지 가속을 구성하거나 {{ .name }} 이미지를 수동으로 풀링한 다음 다시 시도하세요.' +PruneHelper: "이번 정리에서 {{ .name }} {{ .count }}개를 제거하여 {{ .size }} 디스크 공간을 확보했습니다" +ImageRemoveHelper: "이미지 {{ .name }} 삭제, {{ .size }} 디스크 공간 확보" +BuildCache: "빌드 캐시" +Volume: "스토리지 볼륨" +Network: "네트워크" #실행 시간 ErrFileNotExist: '{{ .detail }} 파일이 존재하지 않습니다! 소스 파일의 무결성을 확인하세요!' @@ -290,6 +295,7 @@ TaskPull: '당기기' TaskCommit: '커밋' TaskBuild: '빌드' TaskPush: '푸시' +TaskClean: "정리" TaskHandle: '실행' Website: '웹사이트' App: '애플리케이션' diff --git a/agent/i18n/lang/ms.yaml b/agent/i18n/lang/ms.yaml index 3591b0784..972e99dff 100644 --- a/agent/i18n/lang/ms.yaml +++ b/agent/i18n/lang/ms.yaml @@ -172,6 +172,11 @@ ErrObjectInUsed: 'Objek sedang digunakan dan tidak boleh dipadamkan' ErrObjectBeDependent: 'Imej ini bergantung pada imej lain dan tidak boleh dipadamkan' ErrPortRules: 'Nombor port tidak sepadan, sila masukkan semula!' ErrPgImagePull: 'Tarikh imej tamat masa, sila konfigurasikan pecutan imej atau tarik imej {{ .name }} secara manual dan cuba lagi' +PruneHelper: "Pembersihan ini membuang {{ .name }} {{ .count }} item, membebaskan {{ .size }} ruang cakera" +ImageRemoveHelper: "Padam imej {{ .name }}, membebaskan {{ .size }} ruang cakera" +BuildCache: "Cache binaan" +Volume: "Jilid storan" +Network: "Rangkaian" #masa berjalan ErrFileNotExist: 'Fail {{ .detail }} tidak wujud! Sila semak integriti fail sumber!' @@ -289,6 +294,7 @@ TaskPull: 'Tarik' TaskCommit: 'Komit' TaskBuild: 'Bina' TaskPush: 'Tolak' +TaskClean: "Pembersihan" TaskHandle: 'Laksanakan' Website: 'Laman web' App: 'Aplikasi' diff --git a/agent/i18n/lang/pt-BR.yaml b/agent/i18n/lang/pt-BR.yaml index fbc7354b5..1ce88d326 100644 --- a/agent/i18n/lang/pt-BR.yaml +++ b/agent/i18n/lang/pt-BR.yaml @@ -173,6 +173,11 @@ ErrObjectInUsed: 'O objeto está em uso e não pode ser excluído' ErrObjectBeDependent: 'Esta imagem depende de outras imagens e não pode ser excluída' ErrPortRules: 'O número da porta não corresponde, digite novamente!' ErrPgImagePull: 'Tempo limite para extração de imagem. Configure a aceleração de imagem ou extraia manualmente a imagem {{ .name }} e tente novamente' +PruneHelper: "Esta limpeza removeu {{ .name }} {{ .count }} itens, liberando {{ .size }} de espaço em disco" +ImageRemoveHelper: "Excluída a imagem {{ .name }}, liberando {{ .size }} de espaço em disco" +BuildCache: "Cache de construção" +Volume: "Volume de armazenamento" +Network: "Rede" #tempo de execução ErrFileNotExist: 'O arquivo {{ .detail }} não existe! Verifique a integridade do arquivo de origem!' @@ -290,6 +295,7 @@ TaskPull: 'Puxar' TaskCommit: 'Commit' TaskBuild: 'Construir' TaskPush: 'Empurrar' +TaskClean: "Limpeza" TaskHandle: 'Executar' Website: 'Site' App: 'Aplicativo' diff --git a/agent/i18n/lang/ru.yaml b/agent/i18n/lang/ru.yaml index df39be630..ce158a725 100644 --- a/agent/i18n/lang/ru.yaml +++ b/agent/i18n/lang/ru.yaml @@ -173,6 +173,11 @@ ErrObjectInUsed: 'Объект используется и не может бы ErrObjectBeDependent: 'Это изображение зависит от других изображений и не может быть удалено' ErrPortRules: 'Номер порта не совпадает, введите заново!' ErrPgImagePull: 'Время извлечения изображения истекло. Настройте ускорение изображения или вручную извлеките изображение {{ .name }} и повторите попытку' +PruneHelper: "Очистка удалила {{ .name }} в количестве {{ .count }}, освободив {{ .size }} дискового пространства" +ImageRemoveHelper: "Удалён образ {{ .name }}, освобождено {{ .size }} дискового пространства" +BuildCache: "Кэш сборки" +Volume: "Том хранилища" +Network: "Сеть" #время выполнения ErrFileNotExist: 'Файл {{ .detail }} не существует! Проверьте целостность исходного файла!' @@ -290,6 +295,7 @@ TaskPull: 'Вытянуть' TaskCommit: 'Kоммит' ЗадачаСборка: 'Сборка' TaskPush: 'Push' +TaskClean: "Очистка" TaskHandle: 'Выполнить' Website: 'Be6-сайт' App: 'Приложение' diff --git a/agent/i18n/lang/tr.yaml b/agent/i18n/lang/tr.yaml index e93a8bb01..e3412c3c8 100644 --- a/agent/i18n/lang/tr.yaml +++ b/agent/i18n/lang/tr.yaml @@ -173,6 +173,11 @@ ErrObjectInUsed: 'Nesne kullanımda ve silinemez' ErrObjectBeDependent: 'Bu image diğer imagelere bağlı ve silinemez' ErrPortRules: 'Port numarası eşleşmiyor, lütfen yeniden girin!' ErrPgImagePull: 'Image çekme zaman aşımı, lütfen image hızlandırma yapılandırın veya manuel olarak {{ .name }} imageını çekin ve tekrar deneyin' +PruneHelper: "Bu temizleme {{ .name }} {{ .count }} öğe kaldırdı, {{ .size }} disk alanı boşalttı" +ImageRemoveHelper: "{{ .name }} imajı silindi, {{ .size }} disk alanı boşalttı" +BuildCache: "Derleme önbelleği" +Volume: "Depolama hacmi" +Network: "Ağ" #runtime ErrFileNotExist: '{{ .detail }} dosyası mevcut değil! Lütfen kaynak dosyanın bütünlüğünü kontrol edin!' @@ -288,6 +293,7 @@ TaskPull: 'Çek' TaskCommit: 'işleme' TaskBuild: 'Yapı' TaskPush: 'Gönder' +TaskClean: "Temizleme" TaskHandle: 'Yürüt' Website: 'Web Sitesi' App: 'Uygulama' diff --git a/agent/i18n/lang/zh-Hant.yaml b/agent/i18n/lang/zh-Hant.yaml index d0d6ee749..c19f226fb 100644 --- a/agent/i18n/lang/zh-Hant.yaml +++ b/agent/i18n/lang/zh-Hant.yaml @@ -172,6 +172,11 @@ ErrObjectInUsed: '該物件正被使用,無法刪除' ErrObjectBeDependent: '此鏡像依賴其他鏡像,無法刪除' ErrPortRules: '連接埠數目不匹配,請重新輸入!' ErrPgImagePull: '鏡像拉取逾時,請配置鏡像加速或手動拉取{{ .name }} 鏡像後重試' +PruneHelper: "本次清理 {{ .name }} {{ .count }} 個,釋放磁盤空間 {{ .size }}" +ImageRemoveHelper: "刪除鏡像 {{ .name }} ,釋放磁盤空間 {{ .size }}" +BuildCache: "構建緩存" +Volume: "存儲卷" +Network: "網絡" #runtime ErrFileNotExist: '{{ .detail }} 檔案不存在!請檢查來源檔案完整性!' @@ -289,6 +294,7 @@ TaskPull: '拉取' TaskCommit: '制作' TaskBuild: '建置' TaskPush: '推送' +TaskClean: "清理" TaskHandle: '執行' Website: '網站' App: '應用程式' diff --git a/agent/i18n/lang/zh.yaml b/agent/i18n/lang/zh.yaml index 840573952..9a20d7856 100644 --- a/agent/i18n/lang/zh.yaml +++ b/agent/i18n/lang/zh.yaml @@ -172,6 +172,11 @@ ErrObjectInUsed: "该对象正被使用,无法删除" ErrObjectBeDependent: "该镜像依赖于其他镜像,无法删除" ErrPortRules: "端口数目不匹配,请重新输入!" ErrPgImagePull: "镜像拉取超时,请配置镜像加速或手动拉取 {{ .name }} 镜像后重试" +PruneHelper: "本次清理 {{ .name }} {{ .count }} 个,释放磁盘空间 {{ .size }}" +ImageRemoveHelper: "删除镜像 {{ .name }} ,释放磁盘空间 {{ .size }}" +BuildCache: "构建缓存" +Volume: "存储卷" +Network: "网络" #runtime ErrFileNotExist: "{{ .detail }} 文件不存在!请检查源文件完整性!" @@ -289,6 +294,7 @@ TaskPull: "拉取" TaskCommit: "制作" TaskBuild: "构建" TaskPush: "推送" +TaskClean: "清理" TaskHandle: "执行" Website: "网站" App: "应用" diff --git a/frontend/src/api/interface/cronjob.ts b/frontend/src/api/interface/cronjob.ts index 4dd5ac8ff..abfa4abd4 100644 --- a/frontend/src/api/interface/cronjob.ts +++ b/frontend/src/api/interface/cronjob.ts @@ -1,6 +1,12 @@ import { ReqPage } from '.'; export namespace Cronjob { + export interface Search extends ReqPage { + info: string; + groupIDs: Array; + orderBy?: string; + order?: string; + } export interface CronjobInfo { id: number; name: string; diff --git a/frontend/src/api/interface/index.ts b/frontend/src/api/interface/index.ts index fc65b012e..411be2e67 100644 --- a/frontend/src/api/interface/index.ts +++ b/frontend/src/api/interface/index.ts @@ -20,7 +20,6 @@ export interface ReqPage { } export interface SearchWithPage { info: string; - groupIDs: Array; page: number; pageSize: number; orderBy?: string; diff --git a/frontend/src/api/modules/container.ts b/frontend/src/api/modules/container.ts index bf52f2e85..5d246147f 100644 --- a/frontend/src/api/modules/container.ts +++ b/frontend/src/api/modules/container.ts @@ -53,7 +53,7 @@ export const containerOperator = (params: Container.ContainerOperate) => { return http.post(`/containers/operate`, params); }; export const containerPrune = (params: Container.ContainerPrune) => { - return http.post(`/containers/prune`, params); + return http.post(`/containers/prune`, params); }; export const inspect = (params: Container.ContainerInspect) => { return http.post(`/containers/inspect`, params); @@ -95,7 +95,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/api/modules/cronjob.ts b/frontend/src/api/modules/cronjob.ts index 29613ef6e..c25af768c 100644 --- a/frontend/src/api/modules/cronjob.ts +++ b/frontend/src/api/modules/cronjob.ts @@ -3,7 +3,7 @@ import { ResPage, SearchWithPage } from '../interface'; import { Cronjob } from '../interface/cronjob'; import { TimeoutEnum } from '@/enums/http-enum'; -export const searchCronjobPage = (params: SearchWithPage) => { +export const searchCronjobPage = (params: Cronjob.Search) => { return http.post>(`/cronjobs/search`, params); }; diff --git a/frontend/src/views/container/container/prune/index.vue b/frontend/src/views/container/container/prune/index.vue index 8562843ea..124268d86 100644 --- a/frontend/src/views/container/container/prune/index.vue +++ b/frontend/src/views/container/container/prune/index.vue @@ -18,42 +18,45 @@ +