ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Podman 镜像传输压缩实战:`--compress` 选项在 dir 传输中的应用(podman push / podman save)

Podman 镜像传输压缩实战:`--compress` 选项在 dir 传输中的应用(podman push / podman save) Podman 镜像传输压缩实战--compress选项在 dir 传输中的应用podman push / podman save【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址: https://gitcode.com/gh_mirrors/po/podman导读--compress是 Podman 中用于控制「以dir传输方式写入目录时镜像层是否压缩」的命令行选项同时作用于podman push与podman save两条命令。本文以其官方 man 文档定义为核心结合 Podman 仓库中 push 命令实现 与 save 命令实现 的源码深入讲解该选项的默认行为、适用前提、与--compression-format/--compression-level/--force-compression等选项的协同关系并给出可直接运行的实战命令示例。一、选项定义--compress是什么根据 dir-compress.md 的官方定义--compress当使用dir传输方式将 tarball 镜像层推送到目录时对镜像层进行压缩。默认行为是保持与源镜像相同的压缩类型源是压缩的则压缩源是未压缩的则不压缩。该选项文件被podman push与podman save两条命令的 man 页面共享引用见文件头部的注释This option file is used in: podman push, save并通过option dir-compress机制嵌入到 podman-push.1.md.in 与 podman-save.1.md.in 中预处理脚本为hack/markdown-preprocess。dir传输是containers-transports(5)中定义的一种本地传输方式镜像被写入一个普通目录每个镜像层对应目录中的一个独立文件与把整份镜像打包进单一 tar 归档的docker-archive、oci-archive传输形成对比。它适合本地磁盘备份、离线分发、构建缓存等场景。二、podman push --compress向目录推送镜像时压缩层2.1 命令形态与前提$ podman push [options] image dir:/path/to/directory在podman push中--compress只有配合dir传输才有意义。man 页面明确注明Note: This flag can only be set when using thedirtransport也就是说命令需要显式以dir:前缀指定目标传输方式例如# 将 myimage 以未压缩层推送到本地目录 /tmp/myimage--compress 未指定时的默认行为 $ podman push myimage dir:/tmp/myimage # 强制将镜像层压缩后再写入目录 $ podman push --compress myimage dir:/tmp/myimage2.2 源码中的定义与默认值在 push.go 中该选项被注册为布尔标志默认值为falseflags.BoolVar(pushOptions.Compress, compress, false, Compress tarball image layers when pushing to a directory using the dir transport. (default is same compression type as source))从源码结构可以看出两点关键事实默认值false对应「与源相同压缩类型」即源镜像层原本是压缩的则保持压缩写入原本未压缩的则保持未压缩。这与 man 文档中 default is same compression type, compressed or uncompressed, as source 的描述完全一致在push.go第 146 行存在_ flags.MarkHidden(compress)可以推断该选项在部分运行模式如远程客户端等不适用场景下会被隐藏避免用户误用。2.3 与压缩格式选项的配合podman push同时提供--compression-format与--compression-level见 push.go可精确控制压缩算法与级别--compression-formatgzip | zstd | zstd:chunked指定压缩格式默认gzip可在containers.conf中通过compression_format覆盖见 compression-format.md--compression-levelN指定压缩级别zstd 取值 1–20默认 3gzip 取值 1–9默认 5可在containers.conf中通过compression_level覆盖见 compression-level.md--force-compression即使目标目录中已存在不同压缩方式的变体也强制使用指定压缩算法该选项在显式指定--compression-format时默认视为true见 force-compression.md 及 push.go 中若设置了 compression-format 而未显式设置 force-compression 则自动启用的逻辑。组合示例将镜像层用 zstd、压缩级别 10 压缩后写入目录$ podman push --compress --compression-format zstd --compression-level 10 myimage dir:/tmp/myimage-zstd三、podman save --compress以 docker-dir 格式保存镜像3.1 命令形态与硬性限制podman save用于把本地存储中的镜像保存为归档或目录。其--compress选项与--formatdocker-dir绑定使用$ podman save --compress --format docker-dir -o alp-dir alpineman 页面注明Note: This flag can only be set with--formatdocker-dir.该限制在源码中有硬性校验。在 save.go 中if cmd.Flag(compress).Changed saveOpts.Format ! define.V2s2ManifestDir { return errors.New(--compress can only be set when --format is docker-dir) }即只要--compress被显式指定且格式不是docker-dirV2s2ManifestDir命令会直接报错退出。所谓docker-dir按 podman-save.1.md.in 的定义就是「dir传输配合 v2s2 manifest 类型的目录格式」这也解释了为何它与dir-compress.md共享同一份选项说明。3.2 注册与默认值在 save.go 中flags.BoolVar(saveOpts.Compress, compress, false, Compress tarball image layers when saving to a directory using the dir transport. (default is same compression type as source))默认同样为false即「保持与源相同的压缩类型」。podman save的默认输出格式是docker-archivetar 归档因此若不加--format docker-dir--compress将因上面的校验直接报错。3.3 官方示例man 页面中给出了完整的docker-dir压缩保存示例见 podman-save.1.md.in$ podman save --compress --format docker-dir -o alp-dir alpine Getting image source signatures Copying blob sha256:2fdfe1cd78c20d05774f0919be19bc1a3e4729bce219968e4188e7e0f1af679d 1.97 MB / 1.97 MB [] 0s Copying config sha256:501d1a8f0487e93128df34ea349795bc324d5e0c0d5112e08386a9dfaff620be 584 B / 584 B [] 0s Writing manifest to image destination Storing signatures注意--formatoci-dir与--formatdocker-dir生成的目录格式无法在 Podman 远程客户端macOS 与 WindowsWSL2 除外上用podman load加载见 podman-save.1.md.in若需与docker load互操作应选用默认的docker-archive格式。四、默认压缩策略与相关选项速查--compress的默认行为是「跟随源镜像的压缩状态」这与构建阶段的默认策略一脉相承在 disable-compression.md 中说明Podman 构建镜像时默认不压缩层--disable-compression默认开启因为层在推送到 registry 时会被自动压缩、写入本地存储后又需解压存储。因此选项适用命令默认值说明--compresspush、savefalse跟随源压缩状态仅配合dir传输 /--formatdocker-dir使用--compression-formatpush及 build、manifest push、farm buildgzip可被 containers.conf 覆盖gzip、zstd、zstd:chunked--compression-levelpush及 build、manifest push、farm buildgzip 5 / zstd 3zstd 1–20gzip 1–9--force-compressionpush及 build、manifest push、farm buildfalse显式指定--compression-format时视为true忽略目标已有变体强制使用指定算法选项文件均位于 docs/source/markdown/options/ 目录其对应的 CLI 注册逻辑可分别在 push.go 与 save.go 中查阅验证。五、注意事项与最佳实践传输方式先决条件--compress仅在dir传输push 侧或--formatdocker-dirsave 侧下生效对其他传输registry、docker-archive、oci-archive 等要么无意义、要么直接报错。压缩与解压开销权衡压缩能显著减少目录占用空间但会引入 CPU 开销与耗时对于频繁读写的本地构建缓存目录保持默认跟随源状态往往是更均衡的选择。算法一致性若目录会被其他工具或后续命令读取注意保持压缩算法一致zstd:chunked不支持镜像加密场景加密时会被降级为zstd并给出警告见 compression-format.md。保存格式互操作性docker-dir/oci-dir目录格式在远程客户端上无法用podman load加载跨主机迁移镜像时建议改用docker-archive归档格式。六、延伸阅读推送命令完整说明podman-push.1.md.in保存命令完整说明podman-save.1.md.in共享选项机制说明options/README.md底层调用与容器传输dir:等定义可参考containers-transports(5)相关 man 页面。【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址: https://gitcode.com/gh_mirrors/po/podman创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表