news 2026/9/14 15:33:01

containerd 如何配置 image-verifier 插件在拉取前拦截不符合策略的镜像

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
containerd 如何配置 image-verifier 插件在拉取前拦截不符合策略的镜像

containerd 如何配置 image-verifier 插件在拉取前拦截不符合策略的镜像

【免费下载链接】containerdAn open and reliable container runtime项目地址: https://gitcode.com/GitHub_Trending/co/containerd

如果你在运维一组 containerd 节点,不希望节点拉到来源不受控、不符合安全策略的镜像,可以在镜像拉取(pull)发生之前插入一道校验:containerd 的image-verifier插件(bindir实现)会在镜像被拉取前调用你放置在指定目录中的校验程序(verifier),任何一个 verifier 判定为“不通过”,该镜像的拉取就会被阻止。本文说明如何在 containerd 配置中启用该插件、校验程序需要遵循的接口约定,以及如何判断拦截是否生效。

在 containerd 配置中启用 image-verifier 插件

containerd 提供默认的bindir类型ImageVerifier插件。按 docs/image-verification.md 的说明,在 containerd 配置文件(TOML)中加入如下 stanza:

[plugins] [plugins."io.containerd.image-verifier.v1.bindir"] bin_dir = "/opt/containerd/image-verifier/bin" max_verifiers = 10 per_verifier_timeout = "10s"

三个配置项的含义:

  • bin_dir:存放 verifier 可执行文件的目录。/opt/containerd/image-verifier/bin也是该插件在未显式配置时的默认路径,见 默认配置 和 默认路径。目录中若存在文件,全部文件都必须是符合下文 API 的 verifier 可执行文件。
  • max_verifiers:限制被调用的 verifier 数量。bin_dir中的条目按名称字典序排序,只调用前max_verifiers个,其余跳过;设为负数则不限制数量。
  • per_verifier_timeout:单个 verifier 的执行超时,文档示例为10s

注意插件注册本身在 plugins/imageverifier/plugin.go 中完成(类型ImageVerifier、IDbindir),你只需要写配置,不需要额外编译或注册。

编写符合 API 的 verifier 程序

containerd 不提供现成的策略实现,策略逻辑由你自己编写的 verifier 程序承担。每个 verifier 必须遵循 文档规定的二进制 API:

命令行参数(containerd 调用时传入):

  • -name:本次可能被拉取的镜像引用(reference)。
  • -digest:该镜像解析出的 digest。
  • -stdin-media-type:stdin 中 JSON 数据的 media type。

标准输入:接收一段 JSON 编码的 OCI Content Descriptor(application/vnd.oci.descriptor.v1+json),描述本次可能被拉取的镜像。

判定方式

  • 向 stdout 打印一行判定理由(reason);
  • 以退出码0表示允许拉取,其他任意退出码表示阻止拉取。

仓库测试数据中有一个可直接参考的 verifier 示例(测试夹具,展示如何输出理由并以退出码1拒绝):

package main import ( "fmt" "os" ) func main() { fmt.Println("Reason D") os.Exit(1) }

参见 reject_reason_d.go。对应的允许示例(打印Reason A并以退出码 0 结束)见 accept_reason_a.go。将你的程序编译为可执行文件后,放入bin_dir指向的目录即可,文件名即排序和日志中使用的 verifier 名。

判定组合规则与边界行为

配置好插件后,判断结果如何产生由 调用方契约 明确规定,这也是你验证配置是否生效的依据:

  • bin_dir不存在或目录中没有文件时,image verifier不阻止任何镜像拉取。这是排查“配置了插件却没有拦截”的第一步:确认目录存在且里面有 verifier 可执行文件。
  • 镜像只有在所有被调用的 verifier 都以退出码 0 返回时才会被拉取,即多个 verifier 的判定按AND组合;任何一个返回非 0,拉取即被阻止。
  • 任一 verifier 超过per_verifier_timeout或 exec 失败时,校验以错误告终并返回nil判定(即不会放行)。
  • max_verifiers >= 0时超出数量的 verifier 被跳过,且 containerd 会输出警告日志;max_verifiers < 0时无数量限制。
  • 各 verifier 之间的执行顺序没有保证。
  • verifier 的 stderr 由 containerd 以 debug 级别记录(可能被截断);stdout(判定理由)同样可能被截断,实现中截断上限为 32 KiB,见 bindir.go。
  • verifier 进程占用的系统资源目前计入并受 containerd 自身 cgroup 约束,文档注明该行为可能变化。

验证拦截是否生效

按上述契约可以这样核对行为,全部依据文档给出的判定规则:

  1. 确认bin_dir存在且包含你的 verifier 可执行文件。目录不存在或为空时拉取不会被阻止,属于预期行为而非故障。
  2. 用一个恒拒绝的 verifier(如上例,退出码1)拉取任意镜像:拉取应被阻止,阻止原因形如verifier <名称> rejected image (exit code <码>): <reason>,其中<reason>即 verifier 打印到 stdout 的内容,见 拒绝逻辑。
  3. 用恒通过的 verifier(退出码0)拉取镜像:拉取正常进行,判定理由形如<名称> => <reason>(多个 verifier 时以逗号拼接各程序的结果)。
  4. 需要查看 verifier 的 stderr 细节时,将 containerd 日志调到 debug 级别;stdout/stderr 超限部分会被截断,属预期行为。

限制与说明

  • containerd 仓库只定义了 verifier 接口与调度逻辑,不提供任何具体策略实现;“不符合策略”的判定标准完全由你编写的 verifier 程序决定。
  • 本文涉及的行为均以 docs/image-verification.md 的契约说明为准;verifier 的资源约束(cgroup 计入)等条目文档明确标注“subject to change”,升级 containerd 后应重新核对。

【免费下载链接】containerdAn open and reliable container runtime项目地址: https://gitcode.com/GitHub_Trending/co/containerd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 15:32:30

SSM生活缴费系统从部署到优化:框架分工、状态机与幂等设计

简介&#xff1a;这是一份基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架的生活缴费系统完整源码与设计文档资源&#xff0c;面向Java开发者及需要完成毕业设计、课程设计或期末大作业的学生。系统聚焦水费、电费、燃气费等生活缴费业务场景&#xff0c;涵盖用户管…

作者头像 李华
网站建设 2026/9/14 15:31:20

WTF Solidity 极简入门:Merkle Tree 与 NFT 白名单发放实战

WTF Solidity 极简入门&#xff1a;Merkle Tree 与 NFT 白名单发放实战 【免费下载链接】WTF-Solidity WTF Solidity 极简入门教程&#xff0c;供小白们使用。Now supports English! 官网: https://wtf.academy 项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidi…

作者头像 李华
网站建设 2026/9/14 15:31:11

基于Matlab的微电网日前-日内两阶段优化调度与敏感性分析实现

做微电网优化调度的时候&#xff0c;最让人头疼的往往不是模型本身有多复杂&#xff0c;而是“算完一个结果”和“结果真的敢用”之间隔着一道鸿沟。今天想聊的这个项目&#xff0c;就是一个典型的“日前-日内两阶段优化调度”框架&#xff0c;外加对电价、光伏、风电、负荷四个…

作者头像 李华
网站建设 2026/9/14 15:25:19

手机发烫卡顿?锁帧是降低功耗、稳住游戏帧率的实用技巧

前10分钟手感火热&#xff0c;10分钟之后手指头先遭罪&#xff0c;机身烫得像刚出炉的烤地瓜。这几年我帮身边朋友调手机、看各种反馈&#xff0c;大家面对发烫的第一反应都特别统一&#xff1a;买散热背夹、摘手机壳、关后台&#xff0c;忙活一圈之后发现&#xff0c;真正横在…

作者头像 李华
网站建设 2026/9/14 15:25:06

基于Spring Boot的快递物流信息查询系统设计与实现

我前阵子帮一位准备答辩的学弟梳理项目&#xff0c;他说想做“基于web的快递物流信息查询系统”。当时我就觉得这个选题很有意思——它不像纯粹的CRUD增删改查那样单薄&#xff0c;也不像电商系统那样庞大难以收尾&#xff0c;正好卡在一个恰到好处的位置&#xff1a;前台用户查…

作者头像 李华
网站建设 2026/9/14 15:24:13

DDR2 SDRAM控制器VHDL实现与Spartan-2时序收敛实战

简介&#xff1a;本资源是一套面向FPGA初学者与数字电路设计者的DDR2 SDRAM控制器完整实现方案&#xff0c;聚焦Xilinx Spartan-2系列器件&#xff0c;解决高速存储器接口在FPGA上的时序建模、命令调度与数据通路设计等核心问题。压缩包共126个文件&#xff0c;含46个Verilog&a…

作者头像 李华