侵权投诉

如何把Docker Registry迁移到Harbor

马哥Linux运维 2021-09-07 16:29 次阅读

“要如何将 docker registry 中的镜像迁移至 harbor?本文介绍了四种具体的思路和想法供大家参考。

Registry

Docker Distribution

Docker Distribution 是第一个是实现了打包、发布、存储和镜像分发的工具,起到 docker registry 的作用。(目前 Distribution 已经捐赠给了 CNCF)。其中 Docker Distribution 中的 spec 规范后来也就成为了 OCI distribution-spec 规范。可以认为 Docker Distribution 实现了大部分 OCI 镜像分发的规范,二者在很大程度上也是兼容的。OCI 的指导思想时先有工业界的实践,再将这些实践总结成技术规范,因此尽管 OCI 的 distribution-spec 规范还没有正式发布(目前版本是 v1.0.0-rc1),但以 Docker Distribution 作为基础的镜像仓库已经成为普遍采用的方案,docker registry http api v2 也就成为了事实上的标准。

Harborharbor 也是采用了 Docker Distribution (docker registry)作为后端镜像存储服务,在 harbor 2.0 之前的版本,镜像相关的功能大部分是由 Docker Distribution 来处理,镜像和 OCI 等制品的元数据是 harbor 组件从 docker registry 中提取出来的;harbor 在 2.0 版本之后,镜像等 OCI 制品相关的元数据由 harbor 自己来维护,而且元数据是在 PUSH 这些制品时写入到 harbor 的数据库中的。正因得益于此,harbor 不再仅仅是个用来存储和管理镜像的服务,而一个云原生仓库服务,能够存储和管理符合 OCI 规范的 Helm Chart、CNAB、OPA Bundle 等多种 Artifact。Docker Registry to Harbor回到本文主题:如何将 docker registry 中的镜像迁移至 harbor?

假如内网环境中有两台机器,一台机器上运行着 docker registry,域名假设为 registry.k8s.li 。另一台机器运行着 harbor,假设域名为 harbor.k8s.li。现在 docker registry 中存放了五千个镜像。harbor 是刚刚部署的,里面还没有镜像。在磁盘和网络没有限制的情况下,如何高效地将 docker registry 中的镜像迁移到 harbor 中呢?

获取 Registry 所有镜像的列表

首先在迁移之前我们要获取一份 docker registry 中镜像的列表,这样我们才能保证迁移后没有镜像丢失。根据《 深入浅出容器镜像的一生》一文中提到的 registry 的存储目录结构。在 registry 存储目录中,每个镜像的 tag 都是由 current/index 这个文件指向该 tag 镜像的 manifests 文件的,由此我们可以通过遍历 registry 存储目录中 current/index 文件的方式来得到所有镜像的 tag,由此得到该 registry 中所有镜像的列表。注意,这样只能得到有 tag 的镜像,其他没 tag 的镜像无法获取到。

可通过如下命令在 registry 存储目录下获取镜像列表:

Harbor 创建 project

对于新部署的 harbor 来说,上面只会有一个默认的 library 的 project,需要手动在 harbor 上创建 docker registry 中对应的 project。docker registry 中镜像的 project 就是 registry 存储目录中 repositories 下的目录名。

得到了镜像列表,以及在 harbor 上完成了对应 project 的创建,我们就可以做正式的迁移工作啦。根据不同的场景,可使用如下几种方案:

方案一:docker retag

方案一可能是大多数人首先想到的办法,也是最简单粗暴的方法。就是在一台机器上使用 docker pull 下 docker registry 中的所有镜像,然后再 docker retag 一下,再 docker push 到 harbor 中。

如果之前看过我写的《深入浅出容器镜像的一生》和 《镜像搬运工 skopeo 初体验》,并且已经在日常生活中使用 skopeo ,一定会觉得这并不是个聪明的方案,因为 docker pull –》 docker tag –》 docker pull 的过程中会对镜像的 layer 进行解压缩。对于只是将镜像从一个 registry 复制到另一个 registry 来说,这些 docker 在这些过程中做了很多无用功。详细的原理可以参考上述两篇文章,在此不再赘述。

为了追求高效,我们不使用 docker retag 方案,下面看一下方案二:

方案二:skopeo

在《镜像搬运工 skopeo 初体验》一文中介绍过可以使用 skopeo copy 直接从一个 registry 中复制镜像原始 blobs 到另一个 registry 中,在此期间不会涉及镜像 layer 解压缩操作。在性能和耗时两个角度上,都比使用 docker 的方式高效很多。

使用 skopeo copy

使用 skopeo sync

无论是 docker 和 skopeo 本质上都是通过 registry 的 HTTP API 下载和上传镜像的,在这过程中还是多了不少 HTTP 请求的,如果走的是 HTTPS 的话,还涉及了 HTTPS 加密和解密的过程,这期间有很多无用功。那么还有没有更好的办法?

方案三:迁移存储目录

文章开头提到 harbor 的后端镜像存储也是使用的 docker registry,对于一个 registry 来说,只要是使用的是 Docker Distribution V2 ,它后端的存储目录结构都是一模一样的。那为什么不直接将 registry 的存储目录打包复制并解压到 harbor 的 registry 存储目录?这样又能保证所有的镜像都迁移过去,不会落下任何一个。

对于 harbor 1.x 版本来讲,将 docker registry 的存储目录直接迁移到 harbor 的 registry 存储目录,然后删除 harbor 的 redis 数据(因为 harbor 的 redis 缓存了镜像的元数据信息),重启 harbor 就好了。重启 harbor 之后,harbor 会调用后端的 registry 去提取镜像的元数据信息并存储到 redis 中。这样就完成了迁移的工作。在 docker registry 机器上备份 registry 存储目录

备份完成之后将 docker.tar scp 到 harbor 机器上,然后在 harbor 机器上恢复 registry 存储目录

这样迁移之后可能会遇到无法往 harbor push 镜像的问题。因为 docker registry 容器内 registry 存储目录的所属和所属组为 root,而 harbor registry 容器内 registry 存储目录的所属和所属组为 10000:10000,二者权限并不相同,会导致 harbor 无法 push 镜像。因此在迁移完成之后需要修改一下 harbor registry 目录的所属和所属组。

方案四

对于 harbor 2.x 来讲,由于 harbor 强化了 Artifact 的元数据管理能力,即元数据要在 push 或者 sync 到 harbor 时写入到 harbor 自身的数据库中。在 harbor 看来只要数据库中没有这个 Artifact 的 manifest 信息或者没有这一层 layer 的信息,harbor 都会认为该 Artifact 或者 layer 不存在,返回 404 的错误。按照方案三直接而将 docker registry 存储目录解压到 harbor 的 registry 存储目录的方法行不通的。因为是将镜像解压到 registry 存储中的,虽然在 harbor 的 registry 容器看来是有镜像的,但因为 harbor 的数据库中没有镜像,harbor 就会认为没有镜像。那么现在看来只能通过方案二使用 skopeo 将镜像一个一个地 push 到 harbor 中了。

但对于某些特定的场景下,不能像方案二那样拥有一个 docker registry 的 HTTP 服务,只有一个 docker registry 的压缩包,这如何将 docker registry 的存储目录中的镜像迁移到 harbor 2.0 中呢?在《镜像搬运工 skopeo 初体验》中提到过 skopeo 支持的镜像格式有如下几种:

44144e54-0fb2-11ec-8fb8-12bb97331649.png

需要注意的是,这几种镜像的名字,对应着镜像存在的方式,不同存在的方式对镜像的 layer 处理的方式也不一样,比如 docker:// 这种方式是存在 registry 上的;docker-daemon: 是存在本地 docker pull 下来的;再比如 docker-archive 是通过 docker save 出来的镜像;而 dir: 是镜像以文件夹的形式保存的。同一个镜像有这几种存在的方式就像水有气体、液体、固体一样。可以这样去理解,他们表述的都是同一个镜像,只不过是存在的方式不一样而已。既然镜像是存放在 registry 存储目录里的,那么使用 dir 的形式直接从文件系统读取镜像,理论上来讲会比方案二要好一些。虽然 skopeo 支持 dir 格式的镜像,但 skopeo 目前并不支持直接使用 registry 的存储目录,所以还是需要想办法将 docker registry 存储目录里的每一个镜像转换成 skopeo dir 的形式。skopeo dir那么先来看一下 skopeo dir 是什么样子的?为了方便测试方案的可行性,先使用 skopeo 命令先从 docker hub 上拉取一个镜像,并保存为 dir,命令如下:

使用 tree 命令查看一下 alpine 文件夹的目录结构,如下:

从文件名和大小以及文件的内省我们可以判断出,manifest 文件对应的就是镜像的 manifests 文件;类型为 ASCII text 的文件正是镜像的 image config 文件,里面包含着镜像的元数据信息。而另一个 gzip compressed data 文件不就是经过 gzip 压缩过的镜像 layer 嘛。看一下 manifest 文件的内容也再次印证了这个结论:

镜像的 config 字段对应的正是 e50c909a8df2,而文件类型正是 image.v1+json 文本文件。

镜像的 layer 字段对应的也正是 4c0d98bf9879 而文件类型正是 .tar.gzip gzip 压缩文件。

从 registry 存储目录中捞镜像出来接下来到本文的较为精彩的地方了。如何从 registry 存储里“捞”镜像出来,转换成 skopeo 所支持的 dir 格式。

首先要得到镜像的 manifests 文件,从 manifests 文件中可以得到该镜像的所有 blob 文件。例如对于 registry 存储目录中的 library/alpine:latest 镜像来讲,它在 registry 中是这样存放的:

1.通过 repositories/library/alpine/_manifests/tags/latest/current/link 文件得到 alpine 镜像 lasts 这个 tag 的 manifests 文件的 sha256 值,然后根据这个 sha256 值去 blobs 找到镜像的 manifests 文件;2.根据 current/link 文件中的 sha256 值在 blobs 目录下找到与之对应的文件,blobs 目录下对应的 manifests 文件为 blobs/sha256/39/39eda93d15866957feaee28f8fc5adb545276a64147445c64992ef69804dbf01/data;

3.使用正则匹配,过滤出 manifests 文件中的所有 sha256 值,这些 sha256 值就对应着 blobs 目录下的 image config 文件和 image layer 文件;

4.根据 manifests 文件就可以得到 blobs 目录中镜像的所有 layer 和 image config 文件,然后将这些文件拼成一个 dir 格式的镜像,在这里使用 cp 的方式将镜像从 registry 存储目录里复制出来,过程如下:

最终得到的镜像格式如下:

和上面的 skopeo copy 出来的 dir 文件夹对比一下,除了一个无关紧要的 version 文件,其他的都一摸一样。5.再优化一下,将步骤 4 中的 cp 操作修改成硬链接操作,能极大减少磁盘的 IO 操作。需要注意:硬链接文件不能跨分区,所以要和 registry 存储目录在同一个分区下才行。

然后使用 skopeo copy 或者 skopeo sync 将捞出来的镜像 push 到 harbor

使用 skopeo copy

使用 skopeo sync 需要注意的是,skopeo sync 的方式是同步 project 级别的,镜像的 name 和 tag 就对应的是目录的名称

实现脚本

其实修改一下 skopeo 的源码应该也是可以无缝支持 registry 存储目录的。

对比

45424830-0fb2-11ec-8fb8-12bb97331649.png

对比总结一下以上几种方案:

方案一:上手成本低,适用于镜像数量比较多少,无需安装 skopeo 的情况,缺点是性能较差;

方案二:适用于两个 registry 之间同步复制镜像,如将 docker hub 中的一些公共镜像复制到公司内网的镜像仓库中。

方案三:适用于镜像仓库之间进行迁移,性能是所有方案里最好的,需要额外注意的是如果目的镜像仓库是 harbor 2.x,是无法使用这种方式的。

方案四:是方案三的妥协版,为了适配 harbor 2.0 ,因为需要重新将镜像 push 到 harbor ,所以性能上要比方案三差一些。

责任编辑:haq

原文标题:4 种方法将 Docker Registry 迁移至 Harbor

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

PCB的设计、打板和焊接
最近MicroPython在嵌入式系统领域受到大家的喜爱,攻城狮们都纷纷研究起来,就连我们Funpa....
的头像 电子森林 发表于 10-15 10:04 129次 阅读
怎样去解决耳机的电流声问题
怎样去解决耳机的电流声问题? 怎样去解决archlinux开关机啪啪响的问题? ...
发表于 10-15 07:26 0次 阅读
怎样通过读取电流节点的方式去获取电流呢
怎样通过读取电流节点的方式去获取电流呢?其实验代码是怎样的?...
发表于 10-15 06:48 0次 阅读
步进电机是如何实现正反转的
步进电机是如何实现正反转的?怎样去编写其代码?...
发表于 10-14 09:49 0次 阅读
PA_IK代码该如何去实现
PA_IK代码该如何去实现? PA_VMC算法的原理是什么?...
发表于 10-14 09:00 0次 阅读
STM32L151C8T6低功耗编程代码该如何去编写
STM32L151C8T6低功耗编程代码该如何去编写?
发表于 10-14 07:41 0次 阅读
怎样去定义一个结构体数组呢
数据结构的特点有哪些? 怎样去定义一个结构体数组呢? ...
发表于 10-14 07:25 0次 阅读
能快速找到代码运行最慢部分的编程神器
天下武功,唯快不破。 编程也不例外,你的代码跑的快,你能快速找出代码慢的原因,你的码功就高。 今天分....
的头像 Linux爱好者 发表于 10-13 16:40 104次 阅读
动态内存分配的注意事项及本质是什么
C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态....
的头像 C语言编程学习基地 发表于 10-13 15:37 222次 阅读
动态内存分配的注意事项及本质是什么
用Python实现3D地图教程
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题....
的头像 马哥Linux运维 发表于 10-13 10:09 158次 阅读
用Python实现3D地图教程
关于Python对交通路口的红绿灯进行颜色检测
转自 |   Python联盟 1.视频读取 首先把视频读取进来,因为我测试的视频是4k的所以我用r....
的头像 新机器视觉 发表于 10-13 09:32 214次 阅读
关于Python对交通路口的红绿灯进行颜色检测
spring中声明式事务实现原理猜想
  @Transactional注解简介 @Transactional 是spring中声明式事务管....
的头像 Android编程精选 发表于 10-13 09:20 182次 阅读
stm32启动代码如何进行分析
stm32启动代码如何进行分析
发表于 10-13 06:44 0次 阅读
xv6的文件系统是如何实现的
文件系统 本文继续来看 的文件系统部分, 将文件系统的设计分为 7 层: ,磁盘、缓存区、日志三个部....
的头像 Linux阅码场 发表于 10-12 18:00 123次 阅读
 xv6的文件系统是如何实现的
Linux中匿名页的访问分析
Linux 中 有后备文件支持的页称为文件页,如属于进程的代码段、数据段的页,内存回收的时候这些页面....
的头像 Linux阅码场 发表于 10-12 17:52 151次 阅读
处理器中异常和中断解决
异常是能够引起程序流偏离正常流程的事件,当异常发生时,正在执行的程序就会被挂起,处理器转而执行一块与....
的头像 单片机匠人 发表于 10-12 17:14 268次 阅读
RUST的真实驱动案例
我们无法确定RUST在内核的最终趋势,有多少人愿意迁移,但是至少Linus愿意试水。 Wedson ....
的头像 Linux阅码场 发表于 10-12 15:59 81次 阅读
RUST的真实驱动案例
那些有着巨大影响力的代码盘点
2009 年,Facebook 推出了一份改变世界的代码——点「赞」按钮。「赞」是包括 Leah P....
的头像 strongerHuang 发表于 10-12 15:46 174次 阅读
那些有着巨大影响力的代码盘点
那些书本上都没有提到的C语言volatile用法
许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句....
的头像 STM32嵌入式开发 发表于 10-12 14:47 862次 阅读
那些书本上都没有提到的C语言volatile用法
什么是MicroPython 它能做什么有什么局限
随着Python成为主流的编程语言,MicroPython在嵌入式系统领域也越来越热门起来,尤其是大....
的头像 电子森林 发表于 10-12 11:44 216次 阅读
PO VO DTO转换神器的思路
当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思....
的头像 Linux爱好者 发表于 10-12 11:13 191次 阅读
如何在Colab中使用SQL
如今,编码测试在数据科学面试过程中几乎是标准的。 作为一名数据科学招聘经理,我发现一个20-30分钟....
的头像 智能感知与物联网技术研究所 发表于 10-12 09:39 158次 阅读
如何在Colab中使用SQL
命令行工具Kubectl的别样用法
  kubectl 是 K8s 官方附带的命令行工具,可以方便的操作 K8s 集群。这篇文章主要介绍....
的头像 马哥Linux运维 发表于 10-12 09:31 124次 阅读
一本教你怎么写出让同事无法维护的代码
‍对,你没看错,本文就是教你怎么写出让同事无法维护的代码。一、程序命名 容易输入的变量名 。比如:F....
的头像 Linux爱好者 发表于 10-11 15:45 166次 阅读
优秀的 Verilog/FPGA开源项目介绍(一)
优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信 今天开始会陆续介绍一些优秀的开源项....
的头像 OpenFPGA 发表于 10-11 15:31 239次 阅读
优秀的 Verilog/FPGA开源项目介绍(一)
鸿蒙的网络管理功能你们知道有多厉害吗
  本示例演示了如何使用网络管理模块相关接口,演示了以下功能: 功能 1: 使用默认网络,打开连接,....
的头像 HarmonyOS技术社区 发表于 10-11 14:26 259次 阅读
鸿蒙的网络管理功能你们知道有多厉害吗
开发一个鸿蒙版仿苹果计算器教程.附代码
众所周知鸿蒙 JS 框架是非常轻量级的 MVVM 模式。通过使用和 Vue2 相似的属性劫持技术实现....
的头像 HarmonyOS技术社区 发表于 10-11 14:17 216次 阅读
开发一个鸿蒙版仿苹果计算器教程.附代码
怎样去搭建一种STM32代码生成模型
怎样去搭建一种STM32代码生成模型?要注意哪些问题?...
发表于 10-11 06:25 0次 阅读
剖析verilog2005的骚操作之对数函数
小技巧分享: verilog下取对数其实可用$clog2这个系统函数,和自己找代码里面写入funct....
的头像 玩儿转FPGA 发表于 10-09 15:29 196次 阅读
剖析verilog2005的骚操作之对数函数
Floyd如何求图的最短路径
前言 在 图论 中,在寻路最短路径中除了 Dijkstra 算法以外,还有 Floyd 算法也是非常....
的头像 算法与数据结构 发表于 10-09 14:38 133次 阅读
Floyd如何求图的最短路径
Python版test1实战说明
上一篇文章已经带着大家安装 DeepStream 的 Python 开发环境,并且执行最简单的 de....
的头像 NVIDIA英伟达企业解决方案 发表于 10-09 14:28 149次 阅读
教你们如何用 Python 快速制作海报级地图附代码
 1 简介 基于 Python 中诸如 matplotlib 等功能丰富、自由度极高的绘图库,我们可....
的头像 Linux爱好者 发表于 10-09 11:36 258次 阅读
如何用10行代码轻松在ZYNQ MP上实现图像识别
本文来自赛灵思高级产品应用工程师,张超。如今各种机器学习框架的普及使得个人搭建和训练一个机器学习模型....
的头像 XILINX开发者社区 发表于 10-09 10:47 1723次 阅读
如何用10行代码轻松在ZYNQ MP上实现图像识别
脚本语言的优缺点分别是什么
什么是脚本语言? 脚本语言的特点有哪些? 脚本语言的优缺点分别是什么? ...
发表于 10-09 09:36 0次 阅读
string与《string.h》有哪些区别
string与《string.h》的定义有何不同? string与《string.h》有哪些区别? ...
发表于 10-09 07:22 0次 阅读
LMK04821芯片项目代码详解
大侠好,阿Q来也,今天是第二次和各位见面,请各位大侠多多关照。今天给各位大侠带来一篇项目开发经验分享....
的头像 FPGA技术江湖 发表于 10-08 17:51 286次 阅读
LMK04821芯片项目代码详解
如何用List组件减小JS运行内存
每种编程语言都有它的内存管理机制,不同设备上可用内存不同,分配给JS引擎可用的内存范围也不同。例如运....
的头像 HarmonyOS开发者 发表于 10-08 17:46 184次 阅读
如何链接两个名字一样动态库
在Linux应用的开发过程中,直接利用现成的第三方库(俗称:轮子)来完成自己的业务功能,是很常见的事....
的头像 Linux阅码场 发表于 10-08 14:58 194次 阅读
log2在verilog中到底有什么用
很多小伙伴对上一篇文章讲的取对数没感觉,觉得这个没什么用。确实很多时候用不着,verilog本身不够....
的头像 玩儿转FPGA 发表于 10-08 11:23 232次 阅读
log2在verilog中到底有什么用
如何在没有正式培训的情况下学习编程
从编程小白到完成第一款 Web 应用,我只用了 90 天,而且大多数时间都是在苦恼自己是否能成为开发....
的头像 程序人生 发表于 10-08 10:22 155次 阅读
204B实战应用-LMK04821代码详解(二)
大侠好,阿Q来也,今天是第二次和各位见面,请各位大侠多多关照。今天给各位大侠带来一篇项目开发经验分享....
的头像 OpenFPGA 发表于 10-08 10:18 467次 阅读
204B实战应用-LMK04821代码详解(二)
简述Hive 数据倾斜问题定位排查及解决
多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例。当工作中遇到了倾斜问题,....
的头像 数据分析与开发 发表于 10-08 09:10 188次 阅读
简述Hive 数据倾斜问题定位排查及解决
如何用python实现贪吃蛇游戏
贪吃蛇 具体实现部分,大致分为三个模块来介绍:游戏初始化、游戏运行(蛇移动、吃掉食物)、游戏结束 1....
的头像 马哥Linux运维 发表于 09-29 18:05 453次 阅读
如何用python实现贪吃蛇游戏
如何用一行代码解决空指针问题
在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerExce....
的头像 Android编程精选 发表于 09-29 14:28 234次 阅读
导航对多返回栈的支持
欢迎来到第二个关于导航的 MAD Skill 系列的另一篇文章!本文我们将介绍一个呼声很高的功能,即....
的头像 谷歌开发者 发表于 09-29 11:21 287次 阅读
文件系统中的日志系统是如何实现的
日志 本文来聊聊文件系统中的日志系统,来看一个简单的日志系统是如何实现的。本文是接着前面的 xv6 ....
的头像 Linux阅码场 发表于 09-29 11:04 248次 阅读
文件系统中的日志系统是如何实现的
直流电机控制代码
直流电机控制代码(深圳市普德新星电源技术有限公司官网)- 直流机控制代码 可以控制直流机的转速以及正....
发表于 09-28 12:24 51次 阅读
直流电机控制代码
C语言中的“三字母词”是什么
某软件工程师接盘了前同事的项目,进度一拖再拖,最后发现问题出现在如下代码: // 注释语句 ??/2....
的头像 嵌入式ARM 发表于 09-26 14:46 252次 阅读
芯片开发语言为什么要用Chisel和Verilog
在最近召开的RISC-V中国峰会上,中科院计算所的包云岗研究员团队正式发布了名为“香山”的开源高性能....
的头像 FPGA技术江湖 发表于 09-26 11:00 1666次 阅读
芯片开发语言为什么要用Chisel和Verilog
剖析C语言中scanf函数常见问题
在写C代码时难免对一些知识点不熟悉,导致犯错,今天分享几点小知识给大家。 空白符问题        ....
的头像 STM32嵌入式开发 发表于 09-24 16:45 278次 阅读
拓扑排序算法有什么作用
大家好,我是bigsai。 拓扑排序,很多人都可能听说但是不了解的一种算法。不知者大多会提出这样的疑....
的头像 算法与数据结构 发表于 09-24 10:53 256次 阅读
拓扑排序算法有什么作用
Vivado之VIO原理及应用
虚拟输入输出(Virtual Input Output,VIO)核是一个可定制的IP核,它可用于实时....
的头像 OpenFPGA 发表于 09-23 16:11 266次 阅读
Vivado之VIO原理及应用
简述Git的一些基础知识
  简单地说,Git 究竟是怎样的一个系统呢?请注意接下来的内容非常重要,若你理解了 Git 的思想....
的头像 马哥Linux运维 发表于 09-23 15:43 762次 阅读
简述Git的一些基础知识
让C++代码更加高效的几个小技巧
今天和大家介绍一下能让C++代码更加高效的几个小技巧,话不多说,以下为本文目录: 参数传递方式:值传....
的头像 嵌入式ARM 发表于 09-23 15:20 228次 阅读
让C++代码更加高效的几个小技巧
Python后端项目的协程是什么
最近公司 Python 后端项目进行重构,整个后端逻辑基本都变更为采用“异步”协程的方式实现。看着满....
的头像 Linux爱好者 发表于 09-23 14:38 266次 阅读
STM32的ADC代码例程
STM32的ADC代码例程(普德新星电源技术有限公司怎么样)- STM32的ADC代码例程,有5个例....
发表于 09-23 09:53 45次 阅读
STM32的ADC代码例程
可搭建私人网盘的在线文件浏览器
【导语】:可搭建私人网盘的在线文件浏览器。 简介 filebrowser 提供指定目录下的文件管理界....
的头像 Linux爱好者 发表于 09-23 09:32 224次 阅读
英特尔OpenVINO™将全力助力极视角AI推理加速
在模型开发和部署方面,极市平台集成了最新版本的OpenVINO工具,助力开发者在最小化代码修改的条件....
的头像 英特尔物联网 发表于 09-22 16:19 405次 阅读
英特尔OpenVINO™将全力助力极视角AI推理加速
全面详解Dockerfile文件
Docker 可以通过读取 Dockerfile 中的指令自动构建镜像。Dockerfile 是一个....
的头像 马哥Linux运维 发表于 09-22 15:38 252次 阅读
OpenHarmony HDF HDI的IPC模式具体实现方法和驱动框架能力
HDI接口概述 回顾之前的文章,HDF 驱动框架的一个重要功能是为系统提供稳定的统一的硬件接口,这样....
的头像 HarmonyOS官方合作社区 发表于 09-22 14:55 254次 阅读
OpenHarmony HDF HDI的IPC模式具体实现方法和驱动框架能力