#container-image #reference #docker-image #parser #validation #tags #digest

container_image_dist_ref

一个用于解析和验证容器镜像引用的库

7 个版本

0.3.0 2024年3月10日
0.2.0 2024年2月11日
0.1.4 2024年1月26日

#247 in Unix APIs

Apache-2.0

155KB
3.5K SLoC

Rust 2.5K SLoC // 0.1% comments Shell 793 SLoC // 0.1% comments

container_image_dist_ref

一个 docker/OCI 镜像引用解析器。

Crates.io docs.rs

此库针对权威镜像引用实现进行了广泛的测试,https://github.com/distribution/reference

镜像引用遵循此 EBNF 语法

reference            ::= name (":" tag )? ("@" digest )?
name                 ::= (domain "/")? path
domain               ::= host (":" port-number)?
host                 ::= domain-name | IPv4address | "[" IPv6address "]" /* see https://www.rfc-editor.org/rfc/rfc3986#appendix-A */
domain-name          ::= domain-component ("." domain-component)*
domain-component     ::= ([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])
port-number          ::= [0-9]+
path-component       ::= [a-z0-9]+ (separator [a-z0-9]+)*
path                 ::= path-component ("/" path-component)*
separator            ::= [_.] | "__" | "-"+

tag                  ::= [\w][\w.-]{0,127}

digest               ::= algorithm ":" encoded
algorithm            ::= algorithm-component (algorithm-separator algorithm-component)*
algorithm-separator  ::= [+._-]
algorithm-component  ::= [A-Za-z][A-Za-z0-9]*
encoded              ::= [a-fA-F0-9]{32,} /* At least 128 bit digest value */

identifier           ::= [a-f0-9]{64}

(这是从 https://github.com/distribution/reference/blob/main/reference.go 翻译的)

为了避免最坏情况下的性能,进一步限制了镜像引用

部分 最大长度
名称 255
标签 127
摘要 1024
算法 255

动机

我想在一个 Rust 项目中使用 distribution/reference,但不想处理 go 的 FFI。

目标

  1. distribution/reference 解析器的忠实度
  2. 有趣的优化!

有关这些目标和设计选择,请参阅 ./ARCHITECTURE.md

基准测试

根据一些基本的基准测试,此库相对于 distribution/reference 至少提高了 10 倍的速度。

运行基准测试
#!/bin/bash
cargo bench # rust
( # go
  cd internal/reference_oracle &&
  go test -bench=.
)
我的机器上的基准测试

distribution/reference

goos: linux
goarch: amd64
pkg: github.com/skalt/container_image_dist_ref/internal/reference_oracle
cpu: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
BenchmarkOracleEntireTestSuite-8            9218            148438 ns/op

此包

entire_test_suite       time:   [5.0737 µs 5.1349 µs 5.2047 µs]
speedup = (148438 ns) / ((5.1349 µs) * (1000 ns / µs)) = 28.908

无运行时依赖