30 个版本

0.6.8 2024年7月20日
0.6.5 2024年2月20日
0.6.4 2023年10月26日
0.6.2 2023年7月15日
0.2.7 2019年6月4日

#141算法 分类中

Download history 9087/week @ 2024-04-28 9859/week @ 2024-05-05 10701/week @ 2024-05-12 12702/week @ 2024-05-19 9861/week @ 2024-05-26 9566/week @ 2024-06-02 9453/week @ 2024-06-09 11970/week @ 2024-06-16 14628/week @ 2024-06-23 11778/week @ 2024-06-30 13309/week @ 2024-07-07 14282/week @ 2024-07-14 13149/week @ 2024-07-21 15851/week @ 2024-07-28 14299/week @ 2024-08-04 15117/week @ 2024-08-11

59,336 每月下载量
用于 101 个 crate (直接使用 24 个)

Apache-2.0 协议

270KB
4.5K SLoC

oci-spec-rs

ci gh-pages crates.io codecov docs docs.rs dependencies license

Open Container Initiative (OCI) Rust 规范

此库提供了一个方便的方式来与 Open Container Initiative (OCI) 定义的规范进行交互。

[dependencies]
oci-spec = "0.6.8"

编译器支持:需要 rustc 1.54+

如果您想提议或发布新版本,请遵循我们的 发布流程文档

镜像格式规范示例

  • 从文件系统加载镜像清单
use oci_spec::image::ImageManifest;

let image_manifest = ImageManifest::from_file("manifest.json").unwrap();
assert_eq!(image_manifest.layers().len(), 5);
  • 使用构建器创建新的镜像清单
use oci_spec::image::{
    Descriptor, 
    DescriptorBuilder, 
    ImageManifest, 
    ImageManifestBuilder, 
    MediaType, 
    SCHEMA_VERSION
};

let config = DescriptorBuilder::default()
            .media_type(MediaType::ImageConfig)
            .size(7023)
            .digest("sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7")
            .build()
            .expect("build config descriptor");

let layers: Vec<Descriptor> = [
    (
        32654,
        "sha256:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0",
    ),
    (
        16724,
        "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b",
    ),
    (
        73109,
        "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736",
    ),
]
    .iter()
    .map(|l| {
    DescriptorBuilder::default()
        .media_type(MediaType::ImageLayerGzip)
        .size(l.0)
        .digest(l.1.to_owned())
        .build()
        .expect("build layer")
    })
    .collect();

let image_manifest = ImageManifestBuilder::default()
    .schema_version(SCHEMA_VERSION)
    .config(config)
    .layers(layers)
    .build()
    .expect("build image manifest");

image_manifest.to_file_pretty("my-manifest.json").unwrap();
  • my-manifest.json 的内容
{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7",
    "size": 7023
  },
  "layers": [
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "digest": "sha256:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0",
      "size": 32654
    },
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b",
      "size": 16724
    },
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736",
      "size": 73109
    }
  ]
}

分发规范示例

  • 创建仓库列表
use oci_spec::distribution::RepositoryListBuilder;

let list = RepositoryListBuilder::default()
            .repositories(vec!["busybox".to_owned()])
            .build().unwrap();

贡献

此项目欢迎您的 Pull Request 和问题报告。如果您想处理某个问题,请先在您想要处理的问题上留言,以防止贡献者在同一问题上重复工作。

依赖项

~3.5–5.5MB
~104K SLoC