19个版本

0.3.9 2024年7月26日
0.3.8 2024年6月5日
0.3.5 2024年5月28日
0.2.9 2024年4月11日
0.2.5 2022年8月28日

#158 in Unix API

Download history 12/week @ 2024-04-13 386/week @ 2024-05-04 151/week @ 2024-05-11 33/week @ 2024-05-18 314/week @ 2024-05-25 370/week @ 2024-06-01 37/week @ 2024-06-08 6/week @ 2024-06-15 1/week @ 2024-06-22 83/week @ 2024-07-20 48/week @ 2024-07-27

每月131次下载

MIT/Apache

125KB
2.5K SLoC

ocipkg

crate docs.rs master

包分发的OCI注册表。

功能

ocipkg设计为一个轻量级的OCI注册表客户端

  • 读取和写入oci-archive格式(OCI镜像布局的tar归档)。
  • 无需外部容器运行时(如docker或podman)即可将容器镜像推送到OCI注册表并从OCI注册表拉取

此外,ocipkg还提供了一些实用工具,用于使用OCI注册表进行包分发

  • 用于从文件、目录和带有Cargo.toml元数据的Rust项目构建容器的命令行工具。
  • build.rs辅助工具,用于获取和链接库文件(*.a*.so)作为容器

为什么选择ocipkg?

当我用Rust编写FFIcrate时,我决定启动这个项目。问题在于“如何获取与FFIcrate链接的共享/静态库”。这是困扰我的问题,并阻止我创建可移植的C++库。

我们有三个选项

  1. 使用系统中的库
    • ✔ 系统管理员准备的库,他们将最熟悉系统。
    • ❌ 开发者必须知道库在用户系统中的分布方式,可能是Ubuntu 22.04、20.04、18.04、Debian sid、11、10、9、RHEL9、8、7、ArchLinux、Gentoo Linux、FreeBSD、macOS(使用brew)、Windows(使用winget、chocolatey、scoop)等。
    • ❌ 一些系统不允许多版本库共存。
    • 大多数*-syscrate支持此选项。
  2. 从互联网获取源代码,并在构建时构建和链接
    • ✔ 开发者可以完全控制库。
    • ❌ 用户系统需要开发工具,例如cmake,并需要额外的构建资源。
    • 一些crate支持此选项,并以*-src命名。
  3. 从互联网在构建时获取编译好的库
    • ✔ 开发者也可以完全控制库。
    • ❌ 需要HTTP(或其他协议)服务器来分发库
    • ❌ 开发者必须为每个支持的平台准备二进制文件,例如:x86_64-unknown-linux-gnux86_64-pc-windows-msvcaarch64-unknown-linux-gnu、...

ocipkg专注于第3种选项,即帮助通过OCI注册表分发开发者编译的二进制文件。

示例

Rust

C++/cmake

命令行工具

安装

cargo install ocipkg-cli

ocipkg 命令

待办事项

cargo-ocipkg 命令

一个用于创建和发布由cargo build构建的静态或动态库的容器的工具

$ cargo ocipkg build --release
    Finished release [optimized] target(s) in 0.00s
    Creating oci-archive (/home/teramura/github.com/termoshtt/ocipkg/examples/dynamic/rust/lib/target/release/ocipkg_dd0c7a812fd0fcbc.tar)

文件名采用以下形式:ocipkg_{{ hash }}.tar,这个hash是从镜像名称和Cargo.toml计算得出的。

使用git提交hash确定容器镜像名称,格式为{{ registry }}:$(git rev-parse HEAD --short),其中注册表名称由Cargo.toml设置。

[package.metadata.ocipkg]
registry = "ghcr.io/termoshtt/ocipkg/dynamic/rust"

可以通过cargo-ocipkg publish发布这个容器。

$ cargo ocipkg publish --release
     Publish container (ghcr.io/termoshtt/ocipkg/dynamic/rust:be7f108)

开放容器倡议(OCI)Linux基金会下的一个项目。

由于我们从不运行容器,因此该项目不依赖于OCI运行时规范

使用OCI注册表分发任何文件(不是系统镜像)的想法基于ORAS

尝试使用OCI注册表分发软件包的类似项目

许可协议

© 2020 Toshiki Teramura (@termoshtt)

该项目许可协议为以下之一:

任选其一。

依赖关系

~19–33MB
~553K SLoC