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é.

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
- 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
- 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.
- 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.
- Số lượng thẻ có thể thu được từ hình ảnh
- 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.
- // 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
- kiểu MetaData struct {
- Công cộng chuỗi `json:"công cộng"`
- }
- kiểu ProjectData struct {
- Siêu dữ liệu Siêu dữ liệu `json:"siêu dữ liệu"`
- Dự ánId số nguyên `json:"dự án_id"`
- Tên chuỗi `json:"tên"`
- Số lượng Repo số nguyên `json:"số lượng_kho"`
- }
-
- gõ PData []Dữ liệu dự án
- // Cung cấp địa chỉ bến cảng để lấy dự án
- func GetProject(chuỗi url) []map[chuỗi]chuỗi {
- // xác định địa chỉ
- url = url + "/api/v2.0/dự án"
- //url = url + "/api/dự án"
- // Xây dựng yêu cầu
- yêu cầu, _ := http.NewRequest(http.MethodGet, url,nil)
- //Hủy xác minh
- tr := &http.Vận chuyển{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: ĐÚNG VẬY},
- }
- // định nghĩa khách hàng
- khách hàng := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai, Vận chuyển: tr}
- //client := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai}
- yêu cầu.Tiêu đề.Bộ("chấp nhận", "ứng dụng/json")
- //Đặt người dùng và mật khẩu
- yêu cầu.SetBasicAuth("quản trị viên", "Cảng12345")
- phản hồi, lỗi := client.Do(request)
-
- nếu err != nil {
- fmt.Println("thực hiện thất bại")
- fmt.Println(lỗi)
- }
- // Lấy phần thân
- thân, _ := ioutil.ReadAll(response.Body)
- hoãn phản hồi. Nội dung.Đóng()
- ret := PData{}
- json.Unmarshal([]byte(chuỗi(thân)), &ret)
- var ps = []map[chuỗi]chuỗi{}
- // Lấy dữ liệu trả về
- vì i := 0; i < len(ret); i++ {
- RData := make(bản đồ[chuỗi]chuỗi)
- RData["tên"] = (đúng[i].Tên)
- RData["dự án_id"] = strconv. Itoa(ret[i].ProjectId)
- RData["số lượng_kho"] =strconv.Itoa(ret[i].Số lượng Repo)
- RData["công cộng"] = ret[i].Siêu dữ liệu.Công cộng
-
- ps = thêm vào(ps, RData)
- }
- trở lại p/s
- }
Nhận repo theo dự án.
- //Xác định cấu trúc dữ liệu cần lấy
- kiểu ReposiData struct {
- Nhận dạng số nguyên `json:"nhận dạng"`
- Tên chuỗi `json:"tên"`
- Dự ánId số nguyên `json:"dự án_id"`
- Kéo Đếm số nguyên `json:"số lượng kéo"`
- }
-
- loại RepoData []ReposiData
- // 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
- func GetRepoData(chuỗi url, chuỗi proj) []map[chuỗi]chuỗi {
- // /api/v2.0/projects/goharbor/repositories
- url = url + "/api/v2.0/dự án/" + dự án + "/kho lưu trữ"
- //Xây dựng yêu cầu
- yêu cầu, _ := http.NewRequest(http.MethodGet, url,nil)
- //Bỏ qua xác thực
- tr := &http.Vận chuyển{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: ĐÚNG VẬY},
- }
- khách hàng := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai, Vận chuyển: tr}
- yêu cầu.Tiêu đề.Bộ("chấp nhận", "ứng dụng/json")
- //Đặt tên người dùng và mật khẩu
- yêu cầu.SetBasicAuth("quản trị viên", "Cảng12345")
- phản hồi, lỗi := client.Do(request)
-
- nếu err != nil {
- fmt.Println("thực hiện thất bại")
- fmt.Println(lỗi)
- }
- // Lấy phần thân
- thân, _ := ioutil.ReadAll(response.Body)
- hoãn phản hồi. Nội dung.Đóng()
- đúng := RepoData{}
- json.Unmarshal([]byte(chuỗi(thân)), &ret)
- var ps = []map[chuỗi]chuỗi{}
- // Lấy dữ liệu trả về
- vì i := 0; i < len(ret); i++ {
- RData := make(bản đồ[chuỗi]chuỗi)
- RData["tên"] = (đúng[i].Tên)
- pId := strconv. Itoa(ret[i].ProjectId)
- RData["dự án_id"] = pId
- RData["nhận dạng"] =(strconv. Itoa(ret[i].Id))
- RData["Kéo Đếm"] = (strconv. Itoa(ret[i].PullCount))
- ps = thêm vào(ps, RData)
- }
- trở lại p/s
- }
Hoạt động thẻ gương.
- //Xác định cấu trúc dữ liệu thẻ cần lấy
- Kiểu Thẻ struct {
- Mã hiện vật số nguyên `json:"mã_hiện_tượng"`
- Nhận dạng số nguyên `json:"nhận dạng"`
- Tên chuỗi `json:"tên"`
- Kho lưu trữId số nguyên `json:"repository_id"`
- Chuỗi PushTime `json:"push_time"`
- }
-
- kiểu Tag2 struct {
- Chuỗi ArtifactId `json:"mã_hiện_tượng"`
- Chuỗi id `json:"nhận dạng"`
- Tên chuỗi `json:"tên"`
- Chuỗi RepositoryId `json:"repository_id"`
- Chuỗi PushTime `json:"push_time"`
- }
-
- loại Tag2s []Tag2
- // 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
- hàm DeleTagsByCount(thẻ []map[chuỗi]chuỗi,đếm số nguyên) []sợi dây {
- var re []string
-
- tt := thẻ[0]["thẻ"]
- ss := Thẻ2s{}
- json.Unmarshal([]byte(tt), &ss)
-
- // có một loại
- vì i := 0; i < ống kính(ss); i++ {
- vì j := i + 1; j < len(ss); j++ {
- //Sắp xếp theo thời gian đẩy
- if ss[i].PushTimte > ss[j].PushTimte {
- ss[i], ss[j] = ss[j], ss[i]
- }
- }
- }
- // lấy tất cả thẻ
- vì i := 0; i < ống kính(ss); i++ {
- re = thêm(re, ss[i].Tên)
- }
- // trở lạiđếmcác thẻ sẽ bị xóa,
- trở lại lại[0:đếm]
- }
-
- // delete nhãn qua thẻ được chỉ định sẽ xóa thẻ được chỉ định
- 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{}) {
- url = url + "/api/v2.0/dự án/" + dự án + "/kho lưu trữ/" + kho lưu trữ + "/hiện vật/" + thẻ + "/thẻ/" + thẻ
- yêu cầu, _ := http.NewRequest(http.MethodDelete, url,nil)
- tr := &http.Vận chuyển{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: ĐÚNG VẬY},
- }
- khách hàng := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai, Vận chuyển: tr}
- yêu cầu.Tiêu đề.Bộ("chấp nhận", "ứng dụng/json")
- yêu cầu.SetBasicAuth("quản trị viên", "Pwd123456")
- //Thực hiện xóa thẻ
- phản hồi,_ := client.Do(yêu cầu)
- hoãn phản hồi. Nội dung.Đóng()
-
- var result map[string]interface{}
- bd, lỗi := ioutil.ReadAll(response.Body)
- nếu err == nil {
- err = json.Unmarshal(bd, &result)
- }
- trở lại phản hồi.StatusCode,kết quả
-
- }
-
-
-
-
- //Xác định cấu trúc dữ liệu thẻ cần lấy
- kiểu ArtiData struct {
- Nhận dạng số nguyên `json:"nhận dạng"`
- Dự ánId số nguyên `json:"dự án_id"`
- Kho lưu trữId số nguyên `json:"repository_id"`
- //Tóm tắt chuỗi `json:"tiêu"`
- Thẻ []Thẻ `json:"thẻ"`
- }
-
- gõ AData []ArtiData
- // Nhận dữ liệu thẻ dựa trên địa chỉ bến cảng, dự án và repo
- func GetTags(chuỗi url, chuỗi dự án, chuỗi kho lưu trữ) []map[chuỗi]chuỗi {
- url = url + "/api/v2.0/dự án/" + dự án + "/kho lưu trữ/" + kho lưu trữ + "/hiện vật"
- yêu cầu, _ := http.NewRequest(http.MethodGet, url,nil)
- tr := &http.Vận chuyển{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: ĐÚNG VẬY},
- }
- khách hàng := &http.Client{Thời gian chờ: 10 * thời gian.Thứ hai, Vận chuyển: tr}
- yêu cầu.Tiêu đề.Bộ("chấp nhận", "ứng dụng/json")
- 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")
- yêu cầu.SetBasicAuth("quản trị viên", "Cảng12345")
- // Lấy thẻ
- phản hồi, lỗi := client.Do(request)
-
- nếu err != nil {
- fmt.Println("thực hiện thất bại")
- fmt.Println(lỗi)
- }
-
- thân, _ := ioutil.ReadAll(response.Body)
- hoãn phản hồi. Nội dung.Đóng()
- ret := AData{}
- json.Unmarshal([]byte(chuỗi(thân)),&ret)
- var ps = []map[chuỗi]chuỗi{}
- tổng hợp := 0
- RData := make(bản đồ[chuỗi]chuỗi)
- RData["tên"] = kho lưu trữ
- // Lấy dữ liệu trả về
- vì i := 0; i < len(ret); i++ {
-
- RData["nhận dạng"] = (strconv. Itoa(ret[i].Id))
- RData["dự án_id"] = (strconv. Itoa(ret[i].ProjectId))
- RData["repository_id"] =(strconv.Itoa(ret[i].RepositoryId))
- //RData["tiêu"] = đúng[i].Digest
- var tdata = []map[string]string{}
- tổng hợp = len((ret[i].Tags))
- // Lấy thẻ
- vì j := 0; j < len((ret[i].Tags)); j++ {
- TagData := make(bản đồ[chuỗi]chuỗi)
- Dữ liệu thẻ ["mã_hiện_tượng"] = strconv.Itoa((ret[i].Tags)[j].ArtifactId)
- Dữ liệu thẻ ["nhận dạng"] = strconv.Itoa((ret[i].Tags)[j].Id)
- Dữ liệu thẻ ["tên"] = (ret[i].Thẻ)[j].Tên
- Dữ liệu thẻ ["repository_id"] = strconv.Itoa((ret[i].Tags)[j].RepositoryId)
- Dữ liệu thẻ ["push_time"] = (ret[i].Tags)[j].PushTime
- tdata = append(tdata, TagData)
- }
- RData["đếm"] = strconv.Choke(tổng hợp)
- ss, lỗi := json.Marshal(tdata)
- nếu err != nil {
- fmt.Println("thất bại")
- os.Exit(2)
- }
- RData["thẻ"] = chuỗi(ss)
- ps = thêm vào(ps, RData)
-
- }
- 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.
- // Xác định các thao tác lệnh liên quan để lấy dự án tại bến cảng
- var projectCmd = &cobra.Command{
- Sử dụng: "dự án",
- Ngắn: "cho dự án điều hành",
- Chạy: func(cmd *cobra.Command, args []string) {
-
- đầu ra, lỗi := Thực thi Lệnh("bến cảng","dự án", các đối số...)
- nếu err != nil {
- Lỗi(cmd,args, err)
- }
- fmt.Fprint(os.Stdout, đầu ra)
- },
- }
- // danh sách dự án
- var projectLsCmd = &cobra.Command{
- Sử dụng: "là",
- Ngắn: "liệt kê tất cả các dự án",
- Chạy: func(cmd *cobra.Command, args []string) {
- url, _ := cmd.Flags().GetString("url")
- nếu len(url) == 0 {
- fmt.Println("url là null, vui lòng chỉ định url bến cảng trước!!!!")
- os.Exit(2)
- }
- // Lấy tất cả dự án
- đầu ra := bến cảng.GetProject(url)
- fmt.Println("Tên dự án Cấp độ truy cập Số lượng kho")
- vì tôi := 0; tôi < len(đầu ra); tôi++ {
-
- fmt.Println(đầu ra[Tôi]["tên"], đầu ra[Tôi]["công cộng"], đầu ra[Tôi]["số lượng_kho"])
- }
- },
- }
- // nhiệt
- hàm init() {
- // ./dự án bến cảng ls -u https://
- rootCmd.AddCommand(projectCmd)
- projectCmd.AddCommand(projectLsCmd)
- dự ánLsCmd.Flags().StringP("url", "bạn", "","mặc định: [https://127.0.0.1]")
- }
Lấy danh sách repo.
- // lệnh repo
- var repoCmd = &cobra.Command{
- Sử dụng: "kho lưu trữ",
- Ngắn: "đến kho lưu trữ của nhà điều hành",
- Chạy: func(cmd *cobra.Command, args []string) {
-
- đầu ra, lỗi := Thực thi Lệnh("bến cảng","kho lưu trữ", các đối số...)
- nếu err != nil {
- Lỗi(cmd,args, err)
- }
- fmt.Fprint(os.Stdout, đầu ra)
- },
- }
- // danh sách kho lưu trữ
- var repoLsCmd = &cobra.Command{
- Sử dụng: "là",
- Ngắn: "liệt kê kho lưu trữ của dự án",
- Chạy: func(cmd *cobra.Command, args []string) {
- url, _ := cmd.Flags().GetString("url")
- dự án, _ := cmd.Flags().GetString("dự án")
- nếu len(dự án) == 0 {
- 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ữ !!!")
- os.Exit(2)
- }
- // lấy tất cả kho lưu trữ
- đầu ra := harbor.GetRepoData(url, dự án)
- // Hiển thị dữ liệu
- fmt.Println("Tên kho----------số lần kéo")
- vì tôi := 0; tôi < len(đầu ra); tôi++ {
- fmt.Println(đầu ra[Tôi]["tên"],đầu ra[Tôi]["Kéo Đếm"])
- }
- },
- }
-
- hàm init() {
- // ./kho lưu trữ ls -u https:// -p xxx
- rootCmd.AddCommand(repoCmd)
- repoCmd.AddCommand(repoLsCmd)
- repoLsCmd.Flags().StringP("url", "bạn", "","mặc định: [https://127.0.0.1]")
- repoLsCmd.Flags().StringP("dự án", "P","", "dự án")
- }
hoạt động gắn thẻ.
- // lệnh thẻ
- var tagCmd = &cobra.Command{
- Sử dụng: "nhãn",
- Ngắn: "để hình ảnh nhà điều hành",
- Chạy: func(cmd *cobra.Command, args []string) {
-
- đầu ra, lỗi := Thực thi Lệnh("bến cảng","nhãn", các đối số...)
- nếu err != nil {
- Lỗi(cmd,args, err)
- }
- fmt.Fprint(os.Stdout, đầu ra)
- },
- }
- // thẻ ls
- var tagLsCmd = &cobra.Command{
- Sử dụng: "là",
- 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",
- Chạy: func(cmd *cobra.Command, args []string) {
- url, _ := cmd.Flags().GetString("url")
- dự án, _ := cmd.Flags().GetString("dự án")
- kho lưu trữ, _ := cmd.Flags().GetString("kho lưu trữ")
- // lấy tất cả thẻ
- ss := harbor.GetTags(url, dự án, kho lưu trữ)
- vì i := 0; i < ống kính(ss); i++ {
- đếm, _ := strconv.Atoi((ss[i])["đếm"])
- fmt. Printf("kho lưu trữ %s có %d hình ảnh\n", kho lưu trữ, đếm)
- }
-
- },
- }
-
- // ngày del qua nhãn hoặc số lượng của hình ảnh bạn muốn ĐẾN cứu
- var tagDelCmd = &cobra.Command{
- Sử dụng: "xóa",
- 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",
- Chạy: func(cmd *cobra.Command, args []string) {
- // Lấy đầu vào của người dùng và chuyển đổi nó sang định dạng
- url, _ := cmd.Flags().GetString("url")
- dự án, _ := cmd.Flags().GetString("dự án")
- kho lưu trữ, _ := cmd.Flags().GetString("kho lưu trữ")
- thẻ,_ := cmd.Flags().GetString("nhãn")
- đếm,_ := cmd.Flags().GetString("đếm")
- đúng rồi,_ := strconv.Atoi(đếm)
- nếu len(tag) != 0 && ret != 0 {
- fmt.Println("Bạn không thể chọn cả số lượng và thẻ")
- os.Exit(2)
- } khác nếu len(tag) == 0 && ret != 0 {
- // lấy tất cả thẻ
- retu := harbor.GetTags(url, dự án, kho lưu trữ)
- //delete nhãn qua bạn đã chỉ định số của những hình ảnh bạn muốn ĐẾN cứu
- rTagCount, _ := strconv.Atoi((retu[0])["đếm"])
- // 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.
- nếu ret == rTagCount {
- 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)
- } khác nếu ret > rTagCount {
- 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)
- } khác {
- // Bạn có thể xóa thẻ
- 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))
- thẻ := harbor.GetTags(url, dự án, kho lưu trữ)
- retu := harbor.DeleTagsByCount(thẻ, (rTagCount - ret))
- vì tôi := 0 ; i < len(retu); tôi++ {
- // ĐẾN delete nhãn
- mã, tin nhắn := harbor.DelTags(url, dự án, kho lưu trữ, retu[i])
- 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)
- }
- }
- } khác {
- // delete nhãn qua bạn đã gắn thẻ
- mã, tin nhắn := harbor.DelTags(url, dự án, kho lưu trữ, thẻ)
- fmt.Println(mã, tin nhắn["lỗi"])
- }
- },
- }
-
-
-
- hàm init() {
- // ./thẻ bến cảng ls -u -p -r
- rootCmd.AddCommand(tagCmd)
- tagCmd.AddCommand(tagLsCmd)
- tagLsCmd.Flags().StringP("url", "bạn", "","mặc định: [https://127.0.0.1]")
- tagLsCmd.Flags().StringP("dự án", "P", "","dự án")
- tagLsCmd.Flags().StringP("kho lưu trữ", "r", "","kho lưu trữ")
- // ./thẻ bến cảng del -u -p -r [-t | -c]
- tagCmd.AddCommand(tagDelCmd)
- tagDelCmd.Flags().StringP("url", "bạn", "","mặc định: [https://127.0.0.1]")
- 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")
- 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ẻ")
- tagDelCmd.Flags().StringP("nhãn", "t", "","thẻ, Bạn không thể chọn nó bằng thẻ cùng nhau")
- 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.
- //Nhận trợ giúp
- bến cảng % ./bến cảng -h https://harbor.zaizai.com
- Cách sử dụng:
- bến cảng [cờ]
- cảng [lệnh]
-
- Các lệnh có sẵn:
- hoàn thành tạo ra tập lệnh tự động hoàn thành vì vỏ được chỉ định
- trợ giúp Trợ giúp về bất kì yêu cầu
- dự án ĐẾN dự án điều hành
- kho lưu trữ ĐẾN kho lưu trữ của nhà điều hành
- nhãn ĐẾN hình ảnh người điều hành
-
- Cờ:
- -h,
-
- Sử dụng "cảng [lệnh] --trợ giúp" vì thông tin thêm về lệnh.
-
- //Liệt kê tất cả các dự án
- bến cảng % ./dự án bến cảng ls -u https://harbor.zaizai.com
- Tên dự án Cấp độ tiếp cận Số lượng kho
- bến cảng SAI 3
- thư viện ĐÚNG VẬY 0
- công cộng ĐÚNG VẬY 1
-
- //Liệt kê tất cả các repo
- bến cảng % ./harbor repo ls -u https://harbor.zaizai.com -p goharbor
- Tên kho
- goharbor/cổng-cảng-bến-cảng 0
- goharbor/harbor-db 1
- bến cảng/chuẩn bị 0
-
- //Phân loại thẻ harbor % ./harbor tag ls -u https://harbor.zaizai.com -p goharbor -r harbor-db
- kho lưu trữ harbor-db có 9 hình ảnh
-
- // Xóa tag bằng cách giữ lại 20 ảnh mới nhất
- bến cảng % ./thẻ bến cảng del -u https://harbor.zaizai.com -p goharbor -r harbor-db -c 20
- 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 Và chúng tôi sẽ không làm gì cả!!
-
- // Xóa tag bằng cách giữ lại 10 ảnh mới nhất
- bến cảng % ./thẻ bến cảng del -u https://harbor.zaizai.com -p goharbor -r harbor-db -c 10
- 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 Và chúng tôi sẽ không làm gì cả!!
-
- // Xóa tag bằng cách giữ lại 5 ảnh mới nhất
- bến cảng % ./thẻ bến cảng del -u https://harbor.zaizai.com -p goharbor -r harbor-db -c 5
- chúng tôi sẽ lưu 5 thẻ mới nhất Và delete 4 thẻ khác !!!
- thẻ v2.3.9 là đã xóa, mã trạng thái là 200, tin nhắn là bản đồ[]
- thẻ v2.3.10 là đã xóa, mã trạng thái là 200, tin nhắn là bản đồ[]
- thẻ v2.3.8 là đã xóa, mã trạng thái là 200, tin nhắn là bản đồ[]
- thẻ v2.3.7 là đã xóa, mã trạng thái là 200, tin nhắn là bản đồ[]
-
- //Chỉ định thẻ cần xóa
- caicloud@MacBook-Pro-2 harbor % ./harbor thẻ del -u https://harbor.zaizai.com -p goharbor -r harbor-db -t v2.3.6
- 200
-
- ! ! ! ! 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. ! .
Tôi là một lập trình viên xuất sắc, rất giỏi!