极狐GitLab 镜像仓库使用技巧

极狐GitLab 镜像仓库


众所周知,极狐GitLab 是一个成熟、安全的一体化 DevOps 平台,其自身内置了容器镜像仓库功能,也即极狐GitLab Container Registry,用户可以将自身需要的镜像推送至极狐GitLab 镜像仓库,而无需自建镜像仓库或者使用已经采取了各种限制措施的 dockerhub。

极狐GitLab 的镜像仓库服务有三个不同级别:实例(Instance)级别、项目级别(Project)以及群组(Group)级别。实例级别需要管理员权限,而项目和群组级别则可以不需要管理员权限即可使用。下面分别介绍极狐GitLab 镜像仓库的使用和 API 等内容。

极狐GitLab 镜像仓库的使用


首先来看项目(Project)级别的镜像仓库使用。

项目级别的镜像仓库使用

可以通过每个项目的 Packages & Registries --> Container Registry来找到针对每个项目的镜像仓库的使用。如下图:

图片

首先需要登录极狐GitLab 镜像仓库,使用如下命令:

$ docker login registry.gitlab.cn

在出现的对话框中输入用户名和密码即可登录成功。

密码可以是极狐GitLab 用户的登录密码,也可以是极狐GitLab 的 Personal Access Token。

可以写一个简单的 Dockerfile 来构建镜像并做镜像推送和使用测试:

FROM golang:1.12.9-alpine3.9 as builder
WORKDIR /tmp
COPY main.go /tmp
RUN go build main.goFROM alpine:latest
WORKDIR /usr/src/app/
COPY --from=builder /tmp/devops /usr/src/app/
CMD ["./main"]

其中 main.go 的内容就是输出一个 Hello, 极狐GitLab,我是小马哥!!!。

package mainimport ("fmt""log""net/http"
)func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello,极狐GitLab,我是小马哥!!!"))
}func main() {http.HandleFunc("/jihu", handler)log.Fatal(http.ListenAndServe(":9999", nil))
}

将上述两个文件放在一个新建的空文件目录下,执行如下命令即可开始镜像构建:

$ docker build -t registry.gitlab.cn/majinghe/devops:0.0.1 .

上述几个参数的含义:

  • registry.gitlab.cn:极狐GitLab 镜像仓库的地址

  • majinghe:极狐GitLab 的当前用户

  • devops:项目名称

  • 0.0.1: 镜像tag

需要注意的是,镜像名称的路径层级最多能达到三层,也就是从项目名称开始,后面最多只能是两层。下面几种是有效的镜像名称写法:

registry.gitlab.cn/majinghe/devops:0.0.1
registry.gitlab.cn/majinghe/devops/my:0.0.1
registry.gitlab.cn/majinghe/devops/my/image:0.0.1

registry.gitlab.cn/majinghe/devops/my/image/test:0.0.1

是无效的,因为 devops/my/image/test 是四层,超过了三层,推送的时候会提示denied: requested access to the resource is denied:

$ docker push registry.gitlab.cn/majinghe/devops/my/image/test:0.0.1
The push refers to repository [registry.gitlab.cn/majinghe/devops/my/image/test]
27ce44cf221c: Preparing
9cb8bafb4446: Preparing
e2eb06d8af82: Preparing
denied: requested access to the resource is denied

填写正确的镜像名称,则可以看到如下构建输出:

[+] Building 2.5s (13/13) FINISHED=> [internal] load build definition from Dockerfile                                                                                           0.0s=> => transferring dockerfile: 235B                                                                                                           0.0s=> [internal] load .dockerignore                                                                                                              0.0s=> => transferring context: 2B                                                                                                                0.0s=> [internal] load metadata for docker.io/library/alpine:latest                                                                               1.2s=> [internal] load metadata for docker.io/library/golang:1.12.9-alpine3.9                                                                     2.3s=> [builder 1/4] FROM docker.io/library/golang:1.12.9-alpine3.9@sha256:f6ea65be78b15375bf709cda1f32a4182d0b6a9f26d3dbd76685f5a32966e868       0.0s=> [internal] load build context                                                                                                              0.0s=> => transferring context: 29B                                                                                                               0.0s=> [stage-1 1/3] FROM docker.io/library/alpine:latest@sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a                 0.0s=> CACHED [stage-1 2/3] WORKDIR /usr/src/app/                                                                                                 0.0s=> CACHED [builder 2/4] WORKDIR /tmp                                                                                                          0.0s=> CACHED [builder 3/4] COPY main.go /tmp                                                                                                     0.0s=> CACHED [builder 4/4] RUN go build main.go                                                                                                  0.0s=> [stage-1 3/3] COPY --from=builder /tmp/main /usr/src/app/                                                                                  0.0s=> exporting to image                                                                                                                         0.0s=> => exporting layers                                                                                                                        0.0s=> => writing image sha256:25e31514018235303abbd36f36c39b45ac4896889ab9bc7f4e66b9a3d9f1e27a                                                   0.0s=> => naming to registry.gitlab.cn/majinghe/devops:0.0.1

随后即可将上述镜像推送至 devops 这个项目所对应的项目级别的镜像仓库:

$ docker push registry.gitlab.cn/majinghe/devops:0.0.1
The push refers to repository [registry.gitlab.cn/majinghe/devops]
27ce44cf221c: Pushed
9cb8bafb4446: Pushed
e2eb06d8af82: Pushed
0.0.1: digest: sha256:a15f3f2cd7b283a53eee53bb74a726b74f28b1488f0a3bc37b80d408fc54e4e1 size: 946

可以在其他服务器上用如下命令拉取存储在极狐GitLab 镜像仓库中的上述镜像来做测试:

$ docker run --rm -d -p 9999:9999 registry.gitlab.cn/majinghe/devops:0.0.1
fd4a8aed1938b5ab27265bf7023b9420614dd7ec4ef38e70bad55450cf828c42

然后在浏览器中输入localhost:9999/jihu 或者使用 curl 命令,可查看输出结果:

$ curl localhost:9999/jihu
Hello,极狐GitLab,我是小马哥!!!

可以看到存储在极狐GitLab devops项目所对应的镜像仓库中的镜像是可以被使用的。

群组级别的镜像仓库使用

群组级别的镜像仓库使用和项目级别的镜像仓库使用时类似的,可以在 Group --> Packages & Registries --> Container Registry 找到群组级别的镜像仓库服务。登录方式和项目级别的是一致的,即

$ docker login registry.gitlab.cn

重点在于构建镜像时的镜像名称有所不同,针对群租级别的镜像仓库,其镜像构建时的镜像名称格式如下:

$ registry.gitlab.cn/group-name/project-name:tag

比如,有一个名为 xiaomage 的群组,下面有一个 cr-demo 的项目,则构建命令为:

$ docker build -t registry.gitlab.cn/xiaomage/cr-demo:0.0.1 .

然后,推送至镜像仓库

$ docker push registry.gitlab.cn/xiaomage/cr-demo:0.0.1

针对于不同项目,只需要替换项目名称和 tag 即可完成镜像构建和推送。最后,可以在群组的镜像仓库中看到推送上来的镜像:

图片

可以看到有两个镜像 cr-demo 和 var-demo,分别对应项目 cr-demo 和 var-demo。

一个有趣的测试:前面两个项目都存在于 xiaomage 这个群组下面的,如果要推送镜像至群组中不存在的项目下会怎么样呢?

$ docker build -t registry.gitlab.cn/xiaomage/cr1-demo:0.0.1 .
$ docker push registry.gitlab.cn/xiaomage/cr1-demo:0.0.1
The push refers to repository [registry.gitlab.cn/xiaomage/cr1-demo]
27ce44cf221c: Preparing
9cb8bafb4446: Preparing
e2eb06d8af82: Preparing
denied: requested access to the resource is denied

其中 cr1-demo 这个项目在群组 xiaomage 下面是不存在的,构建可以成功,但是推送的时候提示 denied: requested access to the resource is denied。说明如果在群组中不存在某个项目,则用某个项目名称构建的镜像是无法推送至极狐GitLab 群组级别的镜像仓库中的。

和极狐GitLab CI 的集成使用


可以在极狐GitLab CI 中来使用极狐GitLab 镜像仓库,完成镜像的构建、推送以及使用。整个过程是用到了极狐GitLab 镜像仓库的一些预定义环境变量。关于极狐GitLab 预定义和自定义的环境变量,可以查看过往公众号文章极狐GitLab CI/CD 变量黑魔法你知道多少?(上)和极狐GitLab CI/CD 变量黑魔法你知道多少?(下)。

在 .gitlab-ci.yml 文件中写入如下内容

build:stage: buildscript:- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

即可完成镜像仓库的登陆、镜像构建和推送。控制台中可以看到镜像仓库登陆和构建日志(构建日志太长,截取部分):

图片

镜像推送的日志如下:

图片

极狐GitLab 镜像仓库 API


极狐GitLab 提供了丰富的镜像仓库 API 来对镜像仓库执行相关操作。这样可以很方便的在其他 CI/CD 中系统中集成极狐GitLab 镜像仓库。

list 项目内的镜像仓库

$ curl --header "PRIVATE-TOKEN: MY-极狐GitLab-Personal-Token"\
"https://gitlab.cn/api/v4/projects/9106/registry/repositories?tags=1&tags_count=1

将获取的 token 替换之后,执行命令,返回结果为:

[{"id":157,"name":"","path":"majinghe/devops","project_id":9106,"location":"registry.gitlab.cn/majinghe/devops","created_at":"2021-10-08T16:28:25.319+08:00","cleanup_policy_started_at":null,"tags_count":1,"tags":[{"name":"0.0.1","path":"majinghe/devops:0.0.1","location":"registry.gitlab.cn/majinghe/devops:0.0.1"}]}
]

可以看到镜像仓库内详细内容:有一个镜像仓库,id 是 157,下面有一个镜像,即registry.gitlab.cn/majinghe/devops:0.0.1。

delete 项目内的镜像仓库

$ curl --request DELETE --header "PRIVATE-TOKEN: MY-极狐GitLab-Personal-Token" \
>      "https://gitlab.cn/api/v4/projects/project-id/registry/repositories/repositories-id"
  • project-id:project 的 id,可以直接从极狐GitLab 项目页面获取到。

  • repositories-id:repository 的 id,以 list API 为例,从输出结果看,为 157

成功的话返回结果为 202,随后,再用 list API 进行测试:

$ curl --header "PRIVATE-TOKEN: MY-极狐GitLab-Personal-Token" \
"https://gitlab.cn/api/v4/projects/9106/registry/repositories?tags=1&tags_count=true&name=true"
[]

可以看到,返回结果为空。

list 群组下面的镜像仓库

$ curl --header "PRIVATE-TOKEN: MY-极狐GitLab-Personal-Token" \"https://gitlab.cn/api/v4/groups/group-id/registry/repositories?tags=1&tags_count=true"
  • group-id:Group ID,可以直接在极狐GitLab Group 页面获取到。

返回结果如下:

[{"id":158,"name":"","path":"xiaomage/var-demo","project_id":9693,"location":"registry.gitlab.cn/xiaomage/var-demo","created_at":"2021-10-08T16:35:45.257+08:00","cleanup_policy_started_at":null,"tags_count":1,"tags":[{"name":"0.0.1","path":"xiaomage/var-demo:0.0.1","location":"registry.gitlab.cn/xiaomage/var-demo:0.0.1"}]},{"id":159,"name":"","path":"xiaomage/cr-demo","project_id":9786,"location":"registry.gitlab.cn/xiaomage/cr-demo","created_at":"2021-10-08T16:42:58.681+08:00","cleanup_policy_started_at":null,"tags_count":1,"tags":[{"name":"0.0.1","path":"xiaomage/cr-demo:0.0.1","location":"registry.gitlab.cn/xiaomage/cr-demo:0.0.1"}]},{"id":160,"name":"my/demo-image","path":"xiaomage/cr-demo/my/demo-image","project_id":9786,"location":"registry.gitlab.cn/xiaomage/cr-demo/my/demo-image","created_at":"2021-10-08T16:59:06.896+08:00","cleanup_policy_started_at":null,"tags_count":1,"tags":[{"name":"0.0.1","path":"xiaomage/cr-demo/my/demo-image:0.0.1","location":"registry.gitlab.cn/xiaomage/cr-demo/my/demo-image:0.0.1"}]

可以看到群组 xiaomage 下面有三个 repository,id 分别为:158、159、160。每个 repository 都有 1 个镜像。

delete 群组下面的镜像仓库

由于群组下面的镜像仓库其实最终映射到了群组下面的项目中,所以删除群组下面的镜像仓库和删除某个项目下面的镜像仓库的 API 是一样的:

$ curl --request DELETE --header "PRIVATE-TOKEN: MY-极狐GitLab-Personal-Token" \
>      "https://gitlab.cn/api/v4/projects/project-id/registry/repositories/repositories-id"
  • project-id:project 的 id,可以直接从极狐GitLab 页面直接看到。

  • repositories-id:repository 的 id,以list API 为例,从输出结果看,为 157。

成功的话返回结果为 202

获取某个镜像的详细内容

$ curl --header "PRIVATE-TOKEN: MY-极狐GitLab-Personal-Token" \
>      "https://gitlab.cn/api/v4/projects/project-id/registry/repositories/repository-id/tags/tag"
  • project-id:project id,可以直接在极狐GitLab project 页面获取到。

  • repository-id:repository id,可以从 list repository API 的返回值中得到。

  • tag:镜像的 tag,诸如 0.0.1。

返回结果如下:

{"name":"0.0.1","path":"xiaomage/var-demo:0.0.1","location":"registry.gitlab.cn/xiaomage/var-demo:0.0.1","revision":"25e31514018235303abbd36f36c39b45ac4896889ab9bc7f4e66b9a3d9f1e27a","short_revision":"25e315140","digest":"sha256:a15f3f2cd7b283a53eee53bb74a726b74f28b1488f0a3bc37b80d408fc54e4e1","created_at":"2021-10-08T08:21:55.701+00:00","total_size":6591030
}

删除指定 tag 的镜像

$ curl --request DELETE --header "PRIVATE-TOKEN: AdrW3vvLyWNyxnKUcwwv" \
>      "https://gitlab.cn/api/v4/projects/9693/registry/repositories/158/tags/0.0.1"

成功的话,返回值为200

可以用 list API 查看一下镜像:

$ curl --header "PRIVATE-TOKEN: AdrW3vvLyWNyxnKUcwwv" \
>      "https://gitlab.cn/api/v4/projects/9693/registry/repositories/158/tags/0.0.1"

返回结果如下:

{"message":"404 Tag Not Found"}

也可以在镜像仓库的界面上看到,镜像已经被删除了。

图片

当然,极狐GitLab 镜像仓库还有很多其他的 API,感兴趣的小伙伴可以查看 API 官方文档。

总结


极狐GitLab 镜像仓库使用方便,API 丰富,能够为用户提供灵活的镜像仓库解决方案。当然,镜像存储不仅仅是极狐GitLab 镜像仓库的功能,还有镜像扫描功能,将在后续为大家陆续揭秘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS对象笔记

对象声明 对象也只是一种数据类型/字面值。写对象这个字面值有两种写法,一种是普通的对象,这种对象用new 构造函数(),另一种是JS内特有的json对象。这个对象是直接{}就代表对象。且也是在堆内。 对象的构成 无论是上…

34.在排序数组中查找元素的第一个和最后一个位置

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 进行两次二分查找即可。 解题代码&#xff1a; class Solution { public:vector<int…

道路坑洞数据集(坑洞目标检测)VOC+YOLO格式650张

路面坑洞的形成原因是由于设计、施工、养护处理不当、控制不适和受气候、环境、地质、水文等自然因素影响&#xff0c;以及车辆的运行和车辆超载运行导致路面破损&#xff0c;出现坑洞的现象。 路面坑洞的分类&#xff1a; &#xff08;1&#xff09;路面混凝土板中坑洞&…

python自动化测试实战 —— CSDN的Web页面自动化测试

软件测试专栏 感兴趣可看&#xff1a;软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识&#xff1a; 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…

SpringBoot入门知识

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

ORA-01795: maximum number of expressions in a list is 1000

ORA-01795: maximum number of expressions in a list is 1000 使用in函数出现的报错问题 最近项目上线查询功能出现了一个日志报错&#xff1a;ORA-01795: maximum number of expressions in a list is 1000&#xff0c; 经过开发查询代码得知&#xff0c;是使用in函数出现的…

前端体系:前端应用

目录 前端体系基础 html&#xff08;超文本标记语言&#xff09; css&#xff08;层叠样式单&#xff09; javascript&#xff08;&#xff09; 一、前端体系概述 二、前端框架 React Vue Angular 三、前端库和工具 lodash Redux Webpack 四、模块化和组件化 ES…

微软AutoGen框架:AI的新时代,你的新机遇

一、引言 在科技日新月异的今天&#xff0c;人工智能已经深入到我们生活的各个角落。无论是智能手机、智能家居还是自动驾驶汽车&#xff0c;人工智能的应用无处不在。而在这个领域中&#xff0c;微软AutoGen框架无疑是一颗璀璨的新星。它以其独特的创新性和实用性&#xff0c…

【网络通信原理之套接字】

目录 概念 分类 数据报套接字&#xff1a;使用传输层UDP协议 流套接字&#xff1a;使用传输层TCP协议 原始套接字 Socket编程注意事项 前言&#xff1a;本文主要介绍了在什么是套接字及在Java中套接字是什么&#xff0c;和在套接字编程的注意事项。 概念 Socket套接…

大数据技术之Hive(超级详细)

第1章 Hive入门 1.1 什么是Hive Hive&#xff1a;由Facebook开源用于解决海量结构化日志的数据统计。 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 本质是&#xff1a;将HQL转化成MapReduce程序 …

WPF实现更加灵活绑定复杂Command(使用Microsoft XAML Behaviors 库)

1、安装NuGet 2、在XAML的命名空间引入&#xff1a; xmlns:i"http://schemas.microsoft.com/xaml/behaviors" 3、使用&#xff1a; <Canvas Background"Aqua"><Rectangle Stroke"Red" Width"{Binding RectModel.RectangleWidth}…

Java面向对象思想以及原理以及内存图解

文章目录 什么是面向对象面向对象和面向过程区别创建一个对象用什么运算符?面向对象实现伪代码面向对象三大特征类和对象的关系。 基础案例代码实现实例化创建car对象时car引用的内存图对象调用方法过程 成员变量和局部变量作用范围在内存中的位置 关于对象的引用关系简介相关…

Leetcode刷题笔记题解(C++):328. 奇偶链表

思路&#xff1a;遍历链表生成奇链表和偶链表&#xff0c;然后拼接两个链表生成新的链表。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), ne…

JS基础之作用域链

JS基础之作用域链 作用域链作用域链函数创建函数激活总结 作用域链 当JavaScript代码执行一段可执行的代码&#xff08;execution code&#xff09;时&#xff0c;会创建对应的执行上下文&#xff08;execution context&#xff09;。 对于每个执行上下文&#xff0c;都有三个重…

恢复出厂设置后在 Android 上恢复照片的 6 种常用方法

恢复出厂设置可帮助您删除电子设备的所有信息并将其恢复到原始系统状态。但是&#xff0c;如果您不小心按下了恢复出厂设置按钮并从 Android 设备中删除了所有难忘的照片&#xff0c;该怎么办&#xff1f;好吧&#xff0c;您无需担心&#xff0c;因为可以通过以下一些方法来恢复…

Active Objects设计模式

Active是主动的意思&#xff0c;Active Object是主动对象的意思。主动对象就是拥有自己的独立线程。 Active Object模式不仅有自己的独立线程&#xff0c;还可以接受异步消息&#xff0c;并能返回处理结果。从标准的Active Objects设计入手&#xff0c;将一个接口的方法调用转换…

Apache Flink(十三):Flink History Server

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-06-系统工程

文章目录 1 系统工程概述2. 系统工程方法2.1 霍尔的三维结构2.2 切克兰德方法2.3 并行工程法2.4 综合集成法2.5 WSR系统方法3. 系统工程的生命周期3.1 各阶段1)探索性研究阶段2)概念阶段3)开发阶段4)生产阶段5)使用阶段6)保障阶段7)退役阶段3.2 生命周期方法1)计划驱动方…

缺钱走投无路怎么办

应对财务困境的有效方式 1. 审视并制定财务计划 评估个人或家庭的财务状况&#xff0c;分析收入和支出。制定财务预算&#xff0c;优先支付必要的支出&#xff0c;例如食品、住房和基本生活费用。 2. 与信用机构或服务提供商协商 如果无法按时支付账单或贷款&#xff0c;请…

区块链的可拓展性研究【05】闪电网络

1.闪电网络&#xff1a;闪电网络是一种基于比特币区块链的 Layer2 扩容方案&#xff0c;它通过建立一个双向支付通道网络&#xff0c;实现了快速、低成本的小额支付。闪电网络的交易速度非常快&#xff0c;可以达到每秒数万笔交易&#xff0c;而且交易费用非常低&#xff0c;几…