#rest-client #container #podman #ssh #version #default #connection

podman-rest-client

查询Podman REST API的接口。支持SSH连接。

19个版本 (11个重大更新)

0.12.3 2024年8月23日
0.11.1 2024年8月19日
0.10.2 2024年7月24日

网络编程 中排名第 506

Download history 393/week @ 2024-06-28 30/week @ 2024-07-05 320/week @ 2024-07-12 692/week @ 2024-07-19 143/week @ 2024-07-26 3/week @ 2024-08-02 478/week @ 2024-08-16

每月下载量 686
用于 buildfs

MIT/Apache

1MB
19K SLoC

podman-rest-client

Crates.io Version docs.rs MIT licensed Build

提供查询Podman REST API的接口。大部分接口由官方Podman swagger文件生成。它可以连接到通过ssh到Unix套接字和直接到Unix套接字。在macOs上,容器运行时在可以通过ssh访问的虚拟机中运行时,SSH连接通常是必需的。

API兼容性

使用podman --version确定您正在使用哪个版本的Podman。

v5支持

此crate主要与Podman API的版本5一起工作。版本3、4和5之间有足够的不同之处,许多调用在旧版本中无法工作。

v4支持(状况不佳)

虽然存在v4的支持,但由于官方Podman swagger文件缺少所有类型的定义,所以其状况相当糟糕。一些已手动创建,还有很多工作要做。

Podman套接字

请注意,Podman不像Docker那样以客户端/服务器模式运行,所以通常没有可以连接的套接字。您可能需要启用套接字以便库可以连接。例如,在Linux上,您可能需要运行以下内容

systemctl --user enable --now podman.socket // Enable the podman unix domain socket

在macOS上,您可能需要调用以下内容

podman machine init // Create your podman virtual machine
podman machine start // Start the machine

用法

Linux

在Linux上,您可能初始化一个客户端如下

use podman_rest_client::PodmanRestClient;
use podman_rest_client::Config;

// Initialize a client
let client = PodmanRestClient::new(Config {
    uri: "unix:///run/user/501/podman/podman.sock".to_string(),
    identity_file: None,
}).await.unwrap();

// Fetch a list of container images
let images = client.v5().images().image_list_libpod(None).await.unwrap();

MacOs

在macOs上,您可能使用ssh URL和身份文件初始化客户端如下

let client = PodmanRestClient::new(Config {
    uri: "ssh://[email protected]:63169/run/user/501/podman/podman.sock".to_string(),
    identity_file: Some("/path/to/identity_file".into()),
}).await.unwrap();

Config::guess

您还可以使用Config::guess(),它会根据您所在的平台尝试找到Podman套接字默认路径。

// Setup the default configuration
let config = Config::guess().await.unwrap();

// Initialize a client
let client = PodmanRestClient::new(config).await.unwrap();

// Fetch a list of container images
let images = client.v5().images().image_list_libpod(None).await.unwrap();

客户端/API特质

如果您导入podman_rest_client::v5::Client特质,您可以直接从客户端调用API函数。

use podman_rest_client::v5::Client;
client.images().image_list_libpod(None).await;

您还可以使用各种API特质,例如 podman_rest_client::v5::apis::Images,并直接调用单个请求函数。

use podman_rest_client::v5::apis::Images;
client.image_list_libpod(None).await;

功能

默认功能集为 ["v5", "uds", "ssh"]

  • ssh:支持通过SSH服务器连接到podman。
  • uds:支持通过Unix域套接字连接到podman。
  • v5:支持podman API的第5版
  • v4:支持podman API的第4版。v4还没有准备好使用。

v5 Swagger文件修改

podman项目生成的官方swagger文件存在许多问题,需要手动进行大量修改。您可以通过比较 swagger/swagger-v5.1.0.yamlswagger/swagger-v5.1.0.modified.yaml 来查看更改。

重命名字段

  • definitions/Mount/properties/Target 重命名为 Destination

缺少类型信息

  • definitions/ListContainer/properties/ExposedPorts 类型设置为 object

可空字段

结果发现,golang对nil的处理比较宽松。以下字段被设置为可空

  • definitions/InspectNetworkSettings/properties/Ports/additionalProperties
  • definitions/InspectPodInfraConfig/properties/PortBindings/additionalProperties
  • definitions/PodRmReport/properties/RemovedCtrs/additionalProperties

我不确定,但在这个项目中,可能更合理地默认将所有哈希表值设置为可空。

客户端默认值

一些请求默认在响应中返回额外的流式数据。我们的客户端不支持此功能,因此我们设置了一些客户端覆盖,将这些请求上的 quiet 参数设置为true。

  • responses//libpod/images/pull/post/parameters
  • responses//libpod/images/scp/{name}/post/parameters

在遇到问题时,可能会有更多调整,应在此处进行记录。

变更日志

CHANGELOG.md

依赖项

~8–23MB
~307K SLoC