WSL 容器镜像上传 API 详解:使用 WslcPushSessionImage 推送镜像到远程仓库
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
本指南聚焦 Windows Subsystem for Linux(WSL)容器 SDK 中的镜像管理能力之一 ——WslcPushSessionImage,讲解如何在 C/C++ 程序中调用该 API,将当前会话中的容器镜像推送到远程镜像仓库(Registry)。你将掌握函数签名、WslcPushImageOptions配置结构、进度回调与鉴权字段的完整用法,并结合仓库中的头文件与结构定义理解其底层实现约束,为构建基于 WSL 容器的镜像分发工具提供可直接落地的代码范式。
背景:WSL 容器镜像 API 家族
WslcPushSessionImage隶属于 WSL 开源仓库中 C 语言 API 参考的 Image APIs 一组。该组 API 覆盖了镜像从获取到分发的完整生命周期:
- WslcPullSessionImage:从远程仓库拉取镜像;
- WslcImportSessionImage / WslcImportSessionImageFromFile:从外部来源导入镜像;
- WslcLoadSessionImage / WslcLoadSessionImageFromFile:加载已有镜像;
- WslcListSessionImages:列出会话中的镜像;
- WslcTagSessionImage:为镜像打标签;
- WslcDeleteSessionImage:删除镜像;
- WslcPushSessionImage(本文主角):将镜像推送到远程仓库,与
WslcPullSessionImage形成"上传/下载"的对称闭环。
函数签名与参数详解
WslcPushSessionImage的声明如下(出自 wslcpushsessionimage.md):
STDAPI WslcPushSessionImage(_In_ WslcSession session, _In_ const WslcPushImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage);| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
session | WslcSession | in | 目标会话句柄,由会话管理 API 创建获得 |
options | const WslcPushImageOptions* | in | 推送配置,指定镜像名、鉴权信息与进度回调 |
errorMessage | PWSTR* | out, optional | 失败时返回的详细错误信息字符串,可为NULL |
- 返回值:
HRESULT。返回S_OK表示成功;否则为错误码,建议结合errorMessage输出定位具体失败原因。 - 句柄类型:
WslcSession为不透明句柄,由头文件中的DECLARE_HANDLE(WslcSession)声明(参见 handle-types.md),调用方无需关心其内部结构,直接透传即可。
配置结构 WslcPushImageOptions
推送选项结构体定义如下(出自 wslcpushimageoptions.md):
typedef struct WslcPushImageOptions { _In_z_ PCSTR image; _In_z_ PCSTR registryAuth; // Base64-encoded X-Registry-Auth header value. _In_opt_ WslcContainerImageProgressCallback progressCallback; _In_opt_ PVOID progressCallbackContext; } WslcPushImageOptions;| 字段 | 类型 | 说明 |
|---|---|---|
image | PCSTR | 目标镜像引用,形如"demo/alpine:stable",即仓库/镜像名:标签格式 |
registryAuth | PCSTR | Base64 编码的X-Registry-Auth请求头值,用于向仓库完成鉴权 |
progressCallback | WslcContainerImageProgressCallback | 可选的进度回调,推送过程中持续收到状态通知 |
progressCallbackContext | PVOID | 透传给回调函数的自定义上下文指针,可为NULL |
两点关键实践提示:
- 镜像引用格式:
image字段遵循标准 Registry 引用语法,标签(tag)缺省与否以仓库解析规则为准;若目标仓库为私有仓库,还需在image中包含仓库主机名(如myregistry.example.com/demo/alpine:stable)。 - 鉴权字段编码:
registryAuth是 Base64 编码后的X-Registry-Auth头值——这正是 Docker 客户端向 Registry 提交鉴权凭据的标准机制。编码内容通常是 JSON 结构(如包含username、password、auth、serveraddress等键),经 Base64 编码后填入。若目标仓库无需鉴权,可传NULL,与 WslcPullSessionImage 示例中pullOptions.registryAuth = NULL的用法一致。
进度回调:WslcContainerImageProgressCallback
推送是耗时操作,SDK 通过回调向调用方报告进度。回调类型定义见 wslccontainerimageprogresscallback.md:
typedef HRESULT(CALLBACK* WslcContainerImageProgressCallback)(const WslcImageProgressMessage* progress, PVOID context);回调收到的WslcImageProgressMessage结构(见 wslcimageprogressmessage.md):
typedef struct WslcImageProgressMessage { _Out_ PCSTR id; // layer ID or digest _Out_ WslcImageProgressStatus status; // "Downloading", "Extracting", etc. _Out_ WslcImageProgressDetail detail; } WslcImageProgressMessage;| 字段 | 类型 | 说明 |
|---|---|---|
id | PCSTR | 层 ID 或摘要(digest),标识当前进度对应镜像的哪个层 |
status | WslcImageProgressStatus | 当前状态,如推送/上传、处理中(枚举定义见 wslcimageprogressstatus.md) |
detail | WslcImageProgressDetail | 进度明细,含已处理字节数与总字节数(见 wslcimageprogressdetail.md) |
回调返回HRESULT,调用方可借此向 SDK 反馈继续(S_OK)或中止推送。在 Windows 上使用 COM 编程模型时,回调可能运行在 SDK 的内部线程上,因此回调内应避免执行耗时或阻塞操作,UI 场景建议将进度转发到主线程消息队列。
完整使用示例
结合 wslcpushsessionimage.md 自带的示例,可得到一段可直接编译接入的完整调用代码:
// 进度回调:打印每个层的进度 HRESULT CALLBACK OnImageProgress(const WslcImageProgressMessage* progress, PVOID context) { UNREFERENCED_PARAMETER(context); printf("%s %llu/%llu\n", progress->id, (unsigned long long)progress->detail.currentBytes, (unsigned long long)progress->detail.totalBytes); return S_OK; } WslcPushImageOptions pushOptions = { 0 }; pushOptions.image = "demo/alpine:stable"; pushOptions.registryAuth = "BASE64_X_REGISTRY_AUTH"; pushOptions.progressCallback = OnImageProgress; pushOptions.progressCallbackContext = NULL; HRESULT hr = WslcPushSessionImage(session, &pushOptions, NULL); if (FAILED(hr)) { // 结合 errorMessage 参数获取详细错误信息 PWSTR errorMsg = NULL; hr = WslcPushSessionImage(session, &pushOptions, &errorMsg); // ... 输出 errorMsg 后释放 }示例中pushOptions.image = "demo/alpine:stable"表示将本地会话中标记为demo/alpine:stable的镜像推送到对应的远端仓库位置;registryAuth处填入真实环境计算得到的 Base64 鉴权串。
错误码速查
推送失败时返回的HRESULT错误码定义于 error-codes.md。其中与镜像/仓库操作最相关的包括:
| 符号 | 值 | 含义 |
|---|---|---|
WSLC_E_IMAGE_NOT_FOUND | 0x80040601 | 本地不存在指定镜像,无法推送 |
WSLC_E_REGISTRY_BLOCKED_BY_POLICY | 0x8004060D | 推送被组策略禁止(私有仓库/镜像分发管控场景) |
WSLC_E_SESSION_NOT_FOUND | 0x8004060F | 传入的会话句柄无效 |
WSLC_E_VM_NOT_RUNNING | 0x80040610 | 承载会话的虚拟机未运行 |
调用方应根据不同错误码给出差异化提示:例如WSLC_E_IMAGE_NOT_FOUND提示用户先WslcTagSessionImage或确认镜像名,WSLC_E_REGISTRY_BLOCKED_BY_POLICY则说明当前环境策略不允许推送操作。
小结
WslcPushSessionImage是 WSL 容器 SDK 中镜像上传能力的关键入口:通过WslcPushImageOptions声明目标镜像与鉴权,配合WslcContainerImageProgressCallback获得逐层进度反馈,并以标准HRESULT返回结果。掌握该 API 后,你可以与 Image APIs 中的Pull/List/Tag/Delete等操作组合,构建出完整的镜像生命周期管理工具,实现本地构建、远程分发、镜像同步等实际业务场景。
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考