当前位置: 首页 > news >正文

containerd中文翻译系列(五)客户端选项

containerd 客户端的构建是为了方便用户进行扩展。我们的目标是,调用的执行流程在不同的实现中保持不变,同时编写 Opts 来扩展功能。为了实现这一目标,我们依赖于 Go 中的 Opts 模式。

方法调用

对于客户端软件包中的许多函数和方法,你通常会看到变量参数作为最后一个参数。

如果我们查看客户端上的 NewContainer 方法,就会发现它有一个必要参数 id 和附加的 NewContainerOpts

有几个内置选项允许使用现有规范创建容器,即 WithSpec,以及用于创建或使用现有快照的选项。

func (c *Client) NewContainer(ctx context.Context, id string, opts ...NewContainerOpts) (Container, error) {
}

扩展客户端

作为 containerd 客户端的用户,你需要能够添加自己领域的特定功能。有几种方法可以做到这一点:更改客户端代码、向containerd客户端提交 PR 或fork客户端。只有在尝试过所有其他方法之后,才能考虑这些扩展客户端的方法。

扩展客户端的正确且受支持的方法是构建一个 Opts包,定义应用程序的特定逻辑。

举例来说,如果 Docker 正在集成 containerd 支持并需要添加卷等概念,他们就会创建一个包含选项的 docker 包。

坏的扩展示例
// 示例代码
container, err := client.NewContainer(ctx, id)// 添加卷及其配置并绑定挂载
container.Labels["volumes"] = VolumeConfig{}
container.Spec.Binds  = append({"/var/lib/docker/volumes..."})
好的扩展示例
// 示例代码
import "github.com/docker/docker"
import "github.com/docker/libnetwork"container, err := client.NewContainer(ctx, id,docker.WithVolume("volume-name"),libnetwork.WithOverlayNetwork("cluster-network"),
)

使用这种模式有几个好处。

  1. 您的应用程序代码不会分散在containerd 客户端的执行流中。
  2. 无需模拟 containerd 客户端即可对代码进行单元测试。
  3. 贡献者可以更好地跟踪您的 containerd 实现,并了解何时何地将您的应用逻辑添加到标准 containerd 客户端调用中。

SpecOpt 示例

如果我们想制作一个 SpecOpt 来设置一个容器,以便使用 htop 监控主机系统,这可以很容易地完成,而无需碰触 containerd 代码库中的任何一行代码。

package monitorimport ("github.com/containerd/containerd/v2/oci"specs "github.com/opencontainers/runtime-spec/specs-go"
)// WithHtop配置容器,以便通过 `htop` 监控主机系统
func WithHtop(s *specs.Spec) error {// 确保在host pid 命名空间if err := oci.WithHostNamespace(specs.PIDNamespace)(s); err != nil {return err}// 确保将 htop 设置为参数s.Process.Args = []string{"htop"}// 确保为htop设置TTYif err := oci.WithTTY(s); err != nil {return err}return nil
}

将新选项添加到规范生成中,就像导入新软件包并在创建规范时添加该选项一样简单。

import "github.com/crosbymichael/monitor"container, err := client.NewContainer(ctx, id,containerd.WithNewSpec(oci.WithImageConfig(image), monitor.WithHtop),
)

您可以在这里。查看完整代码并运行监控容器

相关文章:

  • 单片机学习笔记---DS1302时钟
  • 安全之护网(HVV)、红蓝对抗
  • 数据结构——单向链表和双向链表的实现(C语言版)
  • 图像处理常用算法—6个算子 !!
  • uniapp踩坑之项目:简易版不同角色显示不一样的tabbar和页面
  • 【JS逆向一】逆向某站的 加密参数算法--仅供学习参考
  • STM32内部Flash
  • 跟着cherno手搓游戏引擎【23】项目维护、2D引擎之前的一些准备
  • 西工大计算机学院复试问题整理
  • 第6章 智能租房——前期准备
  • 第59讲订单数据下拉实现
  • 《剑指 Offer》专项突破版 - 面试题 36 : 详解后缀表达式(C++ 实现)
  • Android 11 webview webrtc无法使用问题
  • 《Django+React前后端分离项目开发实战:爱计划》 03 理解项目结构
  • 【More Effective C++】条款2:使用C++转型操作符
  • 【刷算法】求1+2+3+...+n
  • angular2开源库收集
  • css的样式优先级
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Python十分钟制作属于你自己的个性logo
  • python学习笔记 - ThreadLocal
  • Vue官网教程学习过程中值得记录的一些事情
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 开发基于以太坊智能合约的DApp
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 微信小程序填坑清单
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用element的upload组件实现多图片上传和压缩
  • No resource identifier found for attribute,RxJava之zip操作符
  • ${factoryList }后面有空格不影响
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (办公)springboot配置aop处理请求.
  • (多级缓存)缓存同步
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (转)memcache、redis缓存
  • (转)Scala的“=”符号简介
  • (转)socket Aio demo
  • (转)Sql Server 保留几位小数的两种做法
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *** 2003
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Net Web项目创建比较不错的参考文章
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET企业级应用架构设计系列之开场白
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [20190416]完善shared latch测试脚本2.txt
  • [AIGC] MySQL存储引擎详解
  • [C/C++] C/C++中数字与字符串之间的转换
  • [Codeforces1137D]Cooperative Game
  • [GN] Vue3快速上手1
  • [Google Guava] 1.1-使用和避免null