sách gpt4 ăn đã đi

Cách xóa nhanh Harbor mirror

In lại Tác giả: qq735679552 Thời gian cập nhật: 29-09-2022 22:32:09 27 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài blog CFSDN hướng dẫn cách xóa nhanh ảnh Harbor này được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.

Cách xóa nhanh Harbor mirror

lý lịch

Trong một cuộc kiểm tra gần đây, người ta phát hiện ra rằng việc sử dụng không gian lưu trữ của bến cảng đã đạt tới 80%. Vì vậy, tôi đã xem xét số lượng thẻ hình ảnh trong mỗi dự án. Tôi thấy rằng có hàng trăm thẻ hình ảnh trong một số dự án. Sau khi tìm hiểu kỹ lưỡng, tôi được biết rằng dự án hiện đang trong giai đoạn gỡ lỗi và được gỡ lỗi nhiều lần trong ngày. Vì không có nhiều dung lượng lưu trữ nên hãy đến bến cảng để xóa các thẻ hình ảnh trước đó và giữ lại những thẻ gần đây nhất. Trong quá trình xóa thủ công, hàng trăm trang đã được tìm thấy và chỉ có 10 trang được hiển thị trên mỗi trang. Tôi phải sắp xếp chúng theo thời gian đẩy trước, sau đó xóa chúng theo từng trang. Tôi nghĩ rằng sẽ ổn thôi nếu tôi trải qua tình huống này một lần, để nó sẽ không xảy ra lần nữa. Sau này, khi suy nghĩ kỹ, tôi nhận ra rằng việc này cũng rất khó kiểm soát nếu xóa thủ công mỗi khi bị phát hiện trong quá trình kiểm tra. Vì vậy, tôi định viết một đoạn script để xóa các thẻ hình ảnh mỗi lần và giữ lại những thẻ gần đây nhất. Gần đây tôi mới học golang nên chỉ dùng nó để viết. Điều đáng xấu hổ hơn là sau khi tôi viết xong kịch bản và kiểm tra nó mà không gặp vấn đề gì, tôi phát hiện ra rằng phiên bản bến cảng mới có thể thiết lập chính sách lưu giữ trên giao diện người dùng. Hãy an ủi bản thân và coi nó như một sự thực hành và cố gắng.

Mục tiêu

  1. Tất cả các dự án hiện tại, dù là công khai hay không, và số lượng kho có thể được truy vấn thông qua dòng lệnh
  2. Bạn có thể truy vấn tên kho, tên hình ảnh và thời gian kéo trong dự án thông qua dòng lệnh.
  3. Bạn có thể chỉ định nhãn và số lượng đặt trước trên dòng lệnh để xóa nhãn hình ảnh.
  4. Số lượng thẻ có thể thu được từ hình ảnh
  5. Sau khi xóa, việc dọn rác ngay lập tức không được hỗ trợ. Vui lòng thực hiện dọn rác theo cách thủ công (lưu ý rằng hình ảnh không thể được đẩy hoặc kéo trong quá trình dọn dẹp)

tuyên bố

Kịch bản này được viết hoàn toàn như một bài tập cá nhân và không mang tính chất tư vấn.

Tôi mới đến Golang, chỉ để đạt được mục tiêu, chất lượng mã cực kỳ kém, xin vui lòng hiểu.

Bến cảng được sử dụng lần này là v2.3.1.

Vui lòng chuyển tất cả các mã sang github.

hoàn thành

Nhận tất cả các dự án tại bến cảng. API có thể được lấy thông qua sự vênh vang của bến cảng.

  1. // Xác định cấu trúc dữ liệu cần lấy dựa trên kết quả kiểm tra độ vênh của bến cảng 
  2. kiểu MetaData struct { 
  3.  Công cộng chuỗi `json:"công cộng"
  4. kiểu ProjectData struct { 
  5.  Siêu dữ liệu Siêu dữ liệu `json:"siêu dữ liệu"
  6.  Dự ánId số nguyên `json:"dự án_id"
  7.  Tên chuỗi `json:"tên"
  8.  Số lượng Repo số nguyên `json:"số lượng_kho"
  9.  
  10. gõ PData []Dữ liệu dự án 
  11. // Cung cấp địa chỉ bến cảng để lấy dự án 
  12. func GetProject(chuỗi url) []map[chuỗi]chuỗi { 
  13.  // xác định địa chỉ 
  14.  url = url + "/api/v2.0/dự án" 
  15.  //url = url + "/api/dự án" 
  16.     // Xây dựng yêu cầu 
  17.  yêu cầu, _ := http.NewRequest(http.MethodGet, url,nil) 
  18.     //Hủy xác minh 
  19.  tr := &http.Vận chuyển{ 
  20.   TLSClientConfig: &tls.Config{InsecureSkipVerify: ĐÚNG VẬY}, 
  21.  } 
  22.     // định nghĩa khách hàng 
  23.  khách hàng := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai, Vận chuyển: tr} 
  24.  //client := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai
  25.  yêu cầu.Tiêu đề.Bộ("chấp nhận""ứng dụng/json"
  26.     //Đặt người dùng và mật khẩu 
  27.  yêu cầu.SetBasicAuth("quản trị viên""Cảng12345"
  28.  phản hồi, lỗi := client.Do(request) 
  29.  
  30.  nếu err != nil { 
  31.   fmt.Println("thực hiện thất bại"
  32.   fmt.Println(lỗi) 
  33.  } 
  34.  // Lấy phần thân 
  35.  thân, _ := ioutil.ReadAll(response.Body) 
  36.  hoãn phản hồi. Nội dung.Đóng() 
  37.  ret := PData{} 
  38.  json.Unmarshal([]byte(chuỗi(thân)), &ret) 
  39.  var ps = []map[chuỗi]chuỗi{} 
  40.     // Lấy dữ liệu trả về 
  41.   i := 0; i < len(ret); i++ { 
  42.   RData := make(bản đồ[chuỗi]chuỗi) 
  43.   RData["tên"] = (đúng[i].Tên
  44.   RData["dự án_id"] = strconv. Itoa(ret[i].ProjectId) 
  45.   RData["số lượng_kho"] =strconv.Itoa(ret[i].Số lượng Repo) 
  46.   RData["công cộng"] = ret[i].Siêu dữ liệu.Công cộng 
  47.  
  48.   ps = thêm vào(ps, RData) 
  49.  } 
  50.  trở lại p/s 

Nhận repo theo dự án.

  1. //Xác định cấu trúc dữ liệu cần lấy 
  2. kiểu ReposiData struct { 
  3.  Nhận dạng số nguyên `json:"nhận dạng"
  4.  Tên chuỗi `json:"tên"
  5.  Dự ánId số nguyên `json:"dự án_id"
  6.  Kéo Đếm số nguyên `json:"số lượng kéo"
  7.  
  8. loại RepoData []ReposiData 
  9. // Nhận repo theo dự án bằng cách cung cấp địa chỉ bến cảng và dự án tương ứng 
  10. func GetRepoData(chuỗi url, chuỗi proj) []map[chuỗi]chuỗi { 
  11.  // /api/v2.0/projects/goharbor/repositories 
  12.  url = url + "/api/v2.0/dự án/" + dự án +  "/kho lưu trữ" 
  13.     //Xây dựng yêu cầu 
  14.  yêu cầu, _ := http.NewRequest(http.MethodGet, url,nil) 
  15.     //Bỏ qua xác thực 
  16.  tr := &http.Vận chuyển{ 
  17.   TLSClientConfig: &tls.Config{InsecureSkipVerify: ĐÚNG VẬY}, 
  18.  } 
  19.  khách hàng := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai, Vận chuyển: tr} 
  20.  yêu cầu.Tiêu đề.Bộ("chấp nhận""ứng dụng/json"
  21.     //Đặt tên người dùng và mật khẩu 
  22.  yêu cầu.SetBasicAuth("quản trị viên""Cảng12345"
  23.  phản hồi, lỗi := client.Do(request) 
  24.  
  25.  nếu err != nil { 
  26.   fmt.Println("thực hiện thất bại"
  27.   fmt.Println(lỗi) 
  28.  } 
  29.  // Lấy phần thân 
  30.  thân, _ := ioutil.ReadAll(response.Body) 
  31.  hoãn phản hồi. Nội dung.Đóng() 
  32.  đúng := RepoData{} 
  33.  json.Unmarshal([]byte(chuỗi(thân)), &ret) 
  34.  var ps = []map[chuỗi]chuỗi{} 
  35.     // Lấy dữ liệu trả về 
  36.   i := 0; i < len(ret); i++ { 
  37.   RData := make(bản đồ[chuỗi]chuỗi) 
  38.   RData["tên"] = (đúng[i].Tên
  39.   pId := strconv. Itoa(ret[i].ProjectId) 
  40.   RData["dự án_id"] = pId 
  41.   RData["nhận dạng"] =(strconv. Itoa(ret[i].Id)) 
  42.   RData["Kéo Đếm"] = (strconv. Itoa(ret[i].PullCount)) 
  43.   ps = thêm vào(ps, RData) 
  44.  } 
  45.  trở lại p/s 

Hoạt động thẻ gương.

  1. //Xác định cấu trúc dữ liệu thẻ cần lấy 
  2. Kiểu Thẻ struct { 
  3.  Mã hiện vật số nguyên  `json:"mã_hiện_tượng"
  4.  Nhận dạng số nguyên `json:"nhận dạng"
  5.  Tên chuỗi `json:"tên"
  6.  Kho lưu trữId số nguyên `json:"repository_id"
  7.  Chuỗi PushTime `json:"push_time"
  8.  
  9. kiểu Tag2 struct { 
  10.  Chuỗi ArtifactId `json:"mã_hiện_tượng"
  11.  Chuỗi id `json:"nhận dạng"
  12.  Tên chuỗi `json:"tên"
  13.  Chuỗi RepositoryId `json:"repository_id"
  14.  Chuỗi PushTime `json:"push_time"
  15.  
  16. loại Tag2s []Tag2 
  17. // delete nhãn qua đã chỉ định đếm, đã qua đâyđếmĐầu tiên lấy danh sách các thẻ cần xóa 
  18. hàm DeleTagsByCount(thẻ []map[chuỗi]chuỗi,đếm số nguyên) []sợi dây { 
  19.  var re []string 
  20.   
  21.  tt := thẻ[0]["thẻ"
  22.  ss := Thẻ2s{} 
  23.  json.Unmarshal([]byte(tt), &ss) 
  24.  
  25.  // có một loại 
  26.   i := 0; i < ống kính(ss); i++ { 
  27.    j := i + 1; j < len(ss); j++ { 
  28.             //Sắp xếp theo thời gian đẩy 
  29.    if ss[i].PushTimte > ss[j].PushTimte { 
  30.     ss[i], ss[j] = ss[j], ss[i] 
  31.    } 
  32.   } 
  33.  } 
  34.  // lấy tất cả thẻ 
  35.   i := 0; i < ống kính(ss); i++ { 
  36.   re = thêm(re, ss[i].Tên
  37.  } 
  38.  // trở lạiđếmcác thẻ sẽ bị xóa, 
  39.  trở lại lại[0:đếm
  40.  
  41. // delete nhãn qua thẻ được chỉ định sẽ xóa thẻ được chỉ định 
  42. func DelTags(chuỗi url, chuỗi dự án, chuỗi kho lưu trữ, chuỗi thẻ) (số nguyên, bản đồ[chuỗi]giao diện{}) { 
  43.  url = url + "/api/v2.0/dự án/" + dự án + "/kho lưu trữ/" + kho lưu trữ + "/hiện vật/" + thẻ + "/thẻ/" + thẻ 
  44.  yêu cầu, _ := http.NewRequest(http.MethodDelete, url,nil) 
  45.  tr := &http.Vận chuyển{ 
  46.   TLSClientConfig: &tls.Config{InsecureSkipVerify: ĐÚNG VẬY}, 
  47.  } 
  48.  khách hàng := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai, Vận chuyển: tr} 
  49.  yêu cầu.Tiêu đề.Bộ("chấp nhận""ứng dụng/json"
  50.  yêu cầu.SetBasicAuth("quản trị viên""Pwd123456"
  51.     //Thực hiện xóa thẻ 
  52.  phản hồi,_ := client.Do(yêu cầu) 
  53.  hoãn phản hồi. Nội dung.Đóng() 
  54.  
  55.  var result map[string]interface{} 
  56.  bd, lỗi := ioutil.ReadAll(response.Body) 
  57.  nếu err == nil { 
  58.   err = json.Unmarshal(bd, &result) 
  59.  } 
  60.  trở lại phản hồi.StatusCode,kết quả 
  61.  
  62.  
  63.  
  64.  
  65.  
  66. //Xác định cấu trúc dữ liệu thẻ cần lấy 
  67. kiểu ArtiData struct { 
  68.  Nhận dạng số nguyên `json:"nhận dạng"
  69.  Dự ánId số nguyên `json:"dự án_id"
  70.  Kho lưu trữId số nguyên `json:"repository_id"
  71.  //Tóm tắt chuỗi `json:"tiêu"
  72.  Thẻ []Thẻ `json:"thẻ"
  73.  
  74. gõ AData []ArtiData 
  75. // Nhận dữ liệu thẻ dựa trên địa chỉ bến cảng, dự án và repo 
  76. func GetTags(chuỗi url, chuỗi dự án, chuỗi kho lưu trữ) []map[chuỗi]chuỗi { 
  77.  url = url + "/api/v2.0/dự án/" + dự án + "/kho lưu trữ/" + kho lưu trữ + "/hiện vật" 
  78.  yêu cầu, _ := http.NewRequest(http.MethodGet, url,nil) 
  79.  tr := &http.Vận chuyển{ 
  80.   TLSClientConfig: &tls.Config{InsecureSkipVerify: ĐÚNG VẬY}, 
  81.  } 
  82.  khách hàng := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai, Vận chuyển: tr} 
  83.  yêu cầu.Tiêu đề.Bộ("chấp nhận""ứng dụng/json"
  84.  yêu cầu.Tiêu đề.Bộ("X-Chấp nhận-Lỗ hổng""ứng dụng/vnd.scanner.adapter.vuln.report.harbor+json; phiên bản=1.0"
  85.  yêu cầu.SetBasicAuth("quản trị viên""Cảng12345"
  86.     // Lấy thẻ 
  87.  phản hồi, lỗi := client.Do(request) 
  88.  
  89.  nếu err != nil { 
  90.   fmt.Println("thực hiện thất bại"
  91.   fmt.Println(lỗi) 
  92.  } 
  93.  
  94.  thân, _ := ioutil.ReadAll(response.Body) 
  95.  hoãn phản hồi. Nội dung.Đóng() 
  96.  ret := AData{} 
  97.  json.Unmarshal([]byte(chuỗi(thân)),&ret) 
  98.  var ps = []map[chuỗi]chuỗi{} 
  99.  tổng hợp := 0 
  100.  RData := make(bản đồ[chuỗi]chuỗi) 
  101.  RData["tên"] = kho lưu trữ 
  102.     // Lấy dữ liệu trả về 
  103.   i := 0; i < len(ret); i++ { 
  104.  
  105.   RData["nhận dạng"] = (strconv. Itoa(ret[i].Id)) 
  106.   RData["dự án_id"] = (strconv. Itoa(ret[i].ProjectId)) 
  107.   RData["repository_id"] =(strconv.Itoa(ret[i].RepositoryId)) 
  108.   //RData["tiêu"] = đúng[i].Digest 
  109.   var tdata = []map[string]string{} 
  110.   tổng hợp = len((ret[i].Tags)) 
  111.         // Lấy thẻ 
  112.    j := 0; j < len((ret[i].Tags)); j++ { 
  113.    TagData := make(bản đồ[chuỗi]chuỗi) 
  114.    Dữ liệu thẻ ["mã_hiện_tượng"] = strconv.Itoa((ret[i].Tags)[j].ArtifactId) 
  115.    Dữ liệu thẻ ["nhận dạng"] = strconv.Itoa((ret[i].Tags)[j].Id) 
  116.    Dữ liệu thẻ ["tên"] = (ret[i].Thẻ)[j].Tên 
  117.    Dữ liệu thẻ ["repository_id"] = strconv.Itoa((ret[i].Tags)[j].RepositoryId) 
  118.    Dữ liệu thẻ ["push_time"] = (ret[i].Tags)[j].PushTime 
  119.    tdata = append(tdata, TagData) 
  120.   } 
  121.   RData["đếm"] = strconv.Choke(tổng hợp
  122.   ss, lỗi := json.Marshal(tdata) 
  123.   nếu err != nil { 
  124.    fmt.Println("thất bại"
  125.    os.Exit(2) 
  126.   } 
  127.   RData["thẻ"] = chuỗi(ss) 
  128.   ps = thêm vào(ps, RData) 
  129.  
  130.  } 
  131.  trở lại p/s 

Nhận đầu vào dòng lệnh của người dùng và liệt kê tất cả các dự án trong bến cảng.

  1. // Xác định các thao tác lệnh liên quan để lấy dự án tại bến cảng 
  2. var projectCmd = &cobra.Command{ 
  3.  Sử dụng: "dự án"
  4.  Ngắn: "cho dự án điều hành"
  5.  Chạy: func(cmd *cobra.Command, args []string) { 
  6.  
  7.   đầu ra, lỗi := Thực thi Lệnh("bến cảng","dự án", các đối số...) 
  8.   nếu err != nil { 
  9.    Lỗi(cmd,args, err) 
  10.   } 
  11.   fmt.Fprint(os.Stdout, đầu ra
  12.  }, 
  13. // danh sách dự án 
  14. var projectLsCmd = &cobra.Command{ 
  15.  Sử dụng: "là"
  16.  Ngắn: "liệt kê tất cả các dự án"
  17.  Chạy: func(cmd *cobra.Command, args []string) { 
  18.   url, _ := cmd.Flags().GetString("url"
  19.   nếu len(url) == 0 { 
  20.    fmt.Println("url là null, vui lòng chỉ định url bến cảng trước!!!!"
  21.    os.Exit(2) 
  22.   } 
  23.         // Lấy tất cả dự án 
  24.   đầu ra := bến cảng.GetProject(url) 
  25.   fmt.Println("Tên dự án Cấp độ truy cập Số lượng kho"
  26.    tôi := 0; tôi < len(đầu ra); tôi++ { 
  27.  
  28.    fmt.Println(đầu ra[Tôi]["tên"], đầu ra[Tôi]["công cộng"], đầu ra[Tôi]["số lượng_kho"]) 
  29.   } 
  30.  }, 
  31. // nhiệt 
  32. hàm init() { 
  33.     // ./dự án bến cảng ls -u https:// 
  34.  rootCmd.AddCommand(projectCmd) 
  35.  projectCmd.AddCommand(projectLsCmd) 
  36.  dự ánLsCmd.Flags().StringP("url""bạn""","mặc định: [https://127.0.0.1]"

Lấy danh sách repo.

  1. // lệnh repo 
  2. var repoCmd = &cobra.Command{ 
  3.  Sử dụng: "kho lưu trữ"
  4.  Ngắn: "đến kho lưu trữ của nhà điều hành"
  5.  Chạy: func(cmd *cobra.Command, args []string) { 
  6.  
  7.   đầu ra, lỗi := Thực thi Lệnh("bến cảng","kho lưu trữ", các đối số...) 
  8.   nếu err != nil { 
  9.    Lỗi(cmd,args, err) 
  10.   } 
  11.   fmt.Fprint(os.Stdout, đầu ra
  12.  }, 
  13. // danh sách kho lưu trữ 
  14. var repoLsCmd = &cobra.Command{ 
  15.  Sử dụng: "là"
  16.  Ngắn: "liệt kê kho lưu trữ của dự án"
  17.  Chạy: func(cmd *cobra.Command, args []string) { 
  18.   url, _ := cmd.Flags().GetString("url"
  19.   dự án, _ := cmd.Flags().GetString("dự án"
  20.   nếu len(dự án) == 0 { 
  21.    fmt.Println("Xin lỗi, bạn phải chỉ rõ dự án mà bạn muốn hiển thị kho lưu trữ !!!"
  22.    os.Exit(2) 
  23.   } 
  24.         // lấy tất cả kho lưu trữ  
  25.   đầu ra := harbor.GetRepoData(url, dự án) 
  26.         // Hiển thị dữ liệu 
  27.   fmt.Println("Tên kho----------số lần kéo"
  28.    tôi := 0; tôi < len(đầu ra); tôi++ { 
  29.    fmt.Println(đầu ra[Tôi]["tên"],đầu ra[Tôi]["Kéo Đếm"]) 
  30.   } 
  31.  }, 
  32.  
  33. hàm init() { 
  34.     // ./kho lưu trữ ls -u https:// -p xxx 
  35.  rootCmd.AddCommand(repoCmd) 
  36.  repoCmd.AddCommand(repoLsCmd) 
  37.  repoLsCmd.Flags().StringP("url""bạn""","mặc định: [https://127.0.0.1]"
  38.  repoLsCmd.Flags().StringP("dự án""P","""dự án"

hoạt động gắn thẻ.

  1. // lệnh thẻ 
  2. var tagCmd = &cobra.Command{ 
  3.  Sử dụng: "nhãn"
  4.  Ngắn: "để hình ảnh nhà điều hành"
  5.  Chạy: func(cmd *cobra.Command, args []string) { 
  6.  
  7.   đầu ra, lỗi := Thực thi Lệnh("bến cảng","nhãn", các đối số...) 
  8.   nếu err != nil { 
  9.    Lỗi(cmd,args, err) 
  10.   } 
  11.   fmt.Fprint(os.Stdout, đầu ra
  12.  }, 
  13. // thẻ ls 
  14. var tagLsCmd = &cobra.Command{ 
  15.  Sử dụng: "là"
  16.  Ngắn: "liệt kê tất cả các thẻ của kho lưu trữ mà bạn đã chỉ định mà bạn nên chỉ định dự án cùng một lúc"
  17.  Chạy: func(cmd *cobra.Command, args []string) { 
  18.   url, _ := cmd.Flags().GetString("url"
  19.   dự án, _ := cmd.Flags().GetString("dự án"
  20.   kho lưu trữ, _ := cmd.Flags().GetString("kho lưu trữ"
  21.         // lấy tất cả thẻ  
  22.   ss := harbor.GetTags(url, dự án, kho lưu trữ) 
  23.    i := 0; i < ống kính(ss); i++ { 
  24.    đếm, _ := strconv.Atoi((ss[i])["đếm"]) 
  25.    fmt. Printf("kho lưu trữ %s có %d hình ảnh\n", kho lưu trữ, đếm
  26.   } 
  27.  
  28.  }, 
  29.  
  30. // ngày del qua nhãn hoặc số lượng của hình ảnh bạn muốn ĐẾN cứu 
  31. var tagDelCmd = &cobra.Command{ 
  32.  Sử dụng: "xóa"
  33.  Ngắn: "xóa các thẻ của kho lưu trữ mà bạn đã chỉ định mà bạn nên chỉ định dự án cùng lúc"
  34.  Chạy: func(cmd *cobra.Command, args []string) { 
  35.         // Lấy đầu vào của người dùng và chuyển đổi nó sang định dạng 
  36.   url, _ := cmd.Flags().GetString("url"
  37.   dự án, _ := cmd.Flags().GetString("dự án"
  38.   kho lưu trữ, _ := cmd.Flags().GetString("kho lưu trữ"
  39.   thẻ,_ := cmd.Flags().GetString("nhãn"
  40.   đếm,_ := cmd.Flags().GetString("đếm"
  41.   đúng rồi,_ := strconv.Atoi(đếm
  42.   nếu len(tag) != 0 && ret != 0 { 
  43.     fmt.Println("Bạn không thể chọn cả số lượng và thẻ"
  44.     os.Exit(2) 
  45.   } khác nếu len(tag) == 0 && ret != 0 { 
  46.             // lấy tất cả thẻ 
  47.    retu := harbor.GetTags(url, dự án, kho lưu trữ) 
  48.             //delete nhãn qua bạn đã chỉ định số của những hình ảnh bạn muốn ĐẾN cứu 
  49.    rTagCount, _ := strconv.Atoi((retu[0])["đếm"]) 
  50.             // Dựa trên đầu vào của người dùngđếmSo sánh với số lượng thẻ thực tế để quyết định có nên xóa thẻ hay không. 
  51.    nếu ret == rTagCount { 
  52.     fmt. Printf("kho lưu trữ %s của dự án %s chỉ có %d thẻ, vì vậy bạn không thể xóa thẻ và chúng tôi sẽ không làm gì cả!!\n", repo, dự án, ret) 
  53.    } khác nếu ret > rTagCount { 
  54.     fmt. Printf("kho lưu trữ %s của dự án %s chỉ có %d thẻ, nhưng bạn muốn xóa %d thẻ, vì vậy chúng tôi khuyên bạn nên nghỉ ngơi và chúng tôi sẽ không làm gì cả!!\n", kho lưu trữ, dự án, rTagCount, ret) 
  55.    } khác { 
  56.                 // Bạn có thể xóa thẻ 
  57.     fmt. Printf("chúng tôi sẽ lưu %d thẻ mới nhất và xóa %d thẻ khác !!!\n", phải, (rTagCount - phải)) 
  58.     thẻ := harbor.GetTags(url, dự án, kho lưu trữ) 
  59.     retu := harbor.DeleTagsByCount(thẻ, (rTagCount - ret)) 
  60.      tôi := 0 ; i < len(retu); tôi++ { 
  61.                     // ĐẾN delete nhãn 
  62.      mã, tin nhắn := harbor.DelTags(url, dự án, kho lưu trữ, retu[i]) 
  63.      fmt. Printf("thẻ %s đã bị xóa, mã trạng thái là %d, tin nhắn là %s\n", mạng [i], hàng đợi, tin nhắn) 
  64.     } 
  65.    } 
  66.   } khác { 
  67.             // delete nhãn qua bạn đã gắn thẻ 
  68.    mã, tin nhắn := harbor.DelTags(url, dự án, kho lưu trữ, thẻ) 
  69.    fmt.Println(mã, tin nhắn["lỗi"]) 
  70.   } 
  71.  }, 
  72.  
  73.  
  74.  
  75. hàm init() { 
  76.     // ./thẻ bến cảng ls -u -p -r 
  77.  rootCmd.AddCommand(tagCmd) 
  78.  tagCmd.AddCommand(tagLsCmd) 
  79.  tagLsCmd.Flags().StringP("url""bạn""","mặc định: [https://127.0.0.1]"
  80.  tagLsCmd.Flags().StringP("dự án""P""","dự án"
  81.  tagLsCmd.Flags().StringP("kho lưu trữ""r""","kho lưu trữ"
  82.  // ./thẻ bến cảng del -u -p -r [-t | -c] 
  83.  tagCmd.AddCommand(tagDelCmd) 
  84.  tagDelCmd.Flags().StringP("url""bạn""","mặc định: [https://127.0.0.1]"
  85.  tagDelCmd.Flags().StringP("dự án""P""","dự án mà bạn nên chỉ định nếu bạn muốn xóa thẻ của bất kỳ kho lưu trữ nào"
  86.  tagDelCmd.Flags().StringP("kho lưu trữ""r""","kho lưu trữ mà bạn nên chỉ định nếu bạn muốn xóa thẻ"
  87.  tagDelCmd.Flags().StringP("nhãn""t""","thẻ, Bạn không thể chọn nó bằng thẻ cùng nhau"
  88.  tagDelCmd.Flags().StringP("đếm""c""","tổng số bạn muốn lưu. Ví dụ: bạn đặt --count=10, chúng tôi sẽ lưu 10 thẻ mới nhất bằng cách sử dụng push_time để sắp xếp, không thể chọn cùng lúc với các thẻ khác"

Bài kiểm tra.

  1. //Nhận trợ giúp 
  2. bến cảng % ./bến cảng -h https://harbor.zaizai.com 
  3. Cách sử dụng: 
  4.   bến cảng [cờ] 
  5.   cảng [lệnh] 
  6.  
  7. Các lệnh có sẵn: 
  8.   hoàn thành tạo ra tập lệnh tự động hoàn thành  vỏ được chỉ định 
  9.   trợ giúp Trợ giúp về bất kì yêu cầu 
  10.   dự án     ĐẾN dự án điều hành 
  11.   kho lưu trữ        ĐẾN kho lưu trữ của nhà điều hành 
  12.   nhãn         ĐẾN hình ảnh người điều hành 
  13.  
  14. Cờ: 
  15.   -h, --help giúp đỡ cho bến cảng 
  16.  
  17. Sử dụng "cảng [lệnh] --trợ giúp"  thông tin thêm về lệnh. 
  18.  
  19. //Liệt kê tất cả các dự án 
  20.  bến cảng % ./dự án bến cảng ls -u https://harbor.zaizai.com 
  21. Tên dự án Cấp độ tiếp cận Số lượng kho 
  22. bến cảng SAI 3 
  23. thư viện ĐÚNG VẬY 0 
  24. công cộng ĐÚNG VẬY 1 
  25.  
  26. //Liệt kê tất cả các repo 
  27. bến cảng % ./harbor repo ls -u https://harbor.zaizai.com -p goharbor 
  28. Tên kho----------Số lần kéo 
  29. goharbor/cổng-cảng-bến-cảng 0 
  30. goharbor/harbor-db 1 
  31. bến cảng/chuẩn bị 0 
  32.  
  33. //Phân loại thẻ harbor % ./harbor tag ls -u https://harbor.zaizai.com -p goharbor -r harbor-db 
  34. kho lưu trữ harbor-db có 9 hình ảnh 
  35.  
  36. // Xóa tag bằng cách giữ lại 20 ảnh mới nhất 
  37. bến cảng % ./thẻ bến cảng del -u https://harbor.zaizai.com -p goharbor -r harbor-db -c 20     
  38. kho lưu trữ harbor-db của dự án goharbor chỉ một có 9 thẻ, nhưng bạn muốn ĐẾN delete 20 thẻ, vì vậy chúng tôi đề xuất bạn ĐẾN nghỉ ngơi  chúng tôi sẽ không làm gì cả!! 
  39.  
  40. // Xóa tag bằng cách giữ lại 10 ảnh mới nhất 
  41. bến cảng % ./thẻ bến cảng del -u https://harbor.zaizai.com -p goharbor -r harbor-db -c 10 
  42. kho lưu trữ harbor-db của dự án goharbor chỉ một có 9 thẻ, nhưng bạn muốn ĐẾN delete 10 thẻ, vì vậy chúng tôi đề xuất bạn ĐẾN nghỉ ngơi  chúng tôi sẽ không làm gì cả!! 
  43.  
  44. // Xóa tag bằng cách giữ lại 5 ảnh mới nhất 
  45. bến cảng % ./thẻ bến cảng del -u https://harbor.zaizai.com -p goharbor -r harbor-db -c 5  
  46. chúng tôi sẽ lưu 5 thẻ mới nhất   delete 4 thẻ khác !!! 
  47. thẻ v2.3.9  đã xóa, mã trạng thái  200, tin nhắn  bản đồ[] 
  48. thẻ v2.3.10  đã xóa, mã trạng thái  200, tin nhắn  bản đồ[] 
  49. thẻ v2.3.8  đã xóa, mã trạng thái  200, tin nhắn  bản đồ[] 
  50. thẻ v2.3.7  đã xóa, mã trạng thái  200, tin nhắn  bản đồ[] 
  51.  
  52. //Chỉ định thẻ cần xóa 
  53. caicloud@MacBook-Pro-2 harbor % ./harbor thẻ del -u https://harbor.zaizai.com -p goharbor -r harbor-db -t v2.3.6 
  54. 200  
  55.  
  56. ! ! ! ! Cuối cùng, bạn cần phải vào giao diện người dùng bến cảng theo cách thủ công để thực hiện việc thu gom rác! ! ! 

Thẩm quyền giải quyết.

https://github.com/spf13/cobra 。

sự vênh váo của bến cảng 。

Liên kết gốc: https://mp.weixin.qq.com/s/64D9omkJx7MJaksOwVnb8g.

Cuối cùng, bài viết về cách xóa nhanh Harbor mirror kết thúc tại đây. Nếu bạn muốn biết thêm về cách xóa nhanh Harbor mirror, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai. ! .

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress