内容提要
本文讨论了将Postgres扩展打包和分发为OCI镜像的理由,OCI镜像是一种方便的打包格式,可以通过OCI注册表进行分发。使用OCI镜像可以解决构建、打包和分发扩展的问题,并提供了安全性增强的标准、工具和系统。作者计划将他们在StackGres上的工作开源,以供其他人在其自己的环境中使用或构建基于OCI的Postgres。
延伸解读
扩展与Postgres的构建环境一致性
文章强调,Postgres扩展必须与Postgres服务器在相同的“宿主操作系统”、libc、编译器及版本下构建,否则可能引发静默数据损坏。这是因为Postgres对libc和ICU版本敏感,动态加载不同环境编译的代码存在风险。因此,打包扩展本质上等同于创建包含扩展的Postgres发行版,两者需紧密绑定。
OCI镜像的层次化优势
OCI镜像由可重用的层组成,每层可独立缓存。对于Postgres扩展,若仅扩展本身更新而依赖库不变,则只需重建包含扩展的层,依赖层保持不变,从而提升构建和分发效率。这种分层特性也便于通过工具如Skopeo进行内省,检查层内容、摘要和元数据。
OCI生态带来的安全与分发便利
采用OCI镜像可复用现有生态:OCI注册表提供成熟的HTTP API,支持大规模分发、缓存和镜像;安全工具如Trivy、Clair可扫描漏洞,签名和证明(如SBOM、SLSA)能增强供应链安全。这避免了自行设计打包格式、签名机制和仓库API的巨大开销,让团队更专注于构建和打包Postgres及其扩展。
非容器环境同样适用
文章澄清,OCI镜像并非只能用于容器。其本质是元数据清单和tar层,通过HTTP提供。作者展示了一个shell脚本,可直接从Dockerhub拉取并解包Postgres镜像到本地目录,无需容器运行时。类似ORAS的项目也支持将任意内容存入OCI注册表。因此,OCI镜像也可用于非容器化环境,如传统部署或空气隔离系统。
Q&A
为什么要将Postgres扩展打包为OCI镜像?
将Postgres扩展打包为OCI镜像可以解决构建、打包和分发的问题,并提供安全性增强的标准和工具。
OCI镜像的结构是怎样的?
OCI镜像由一组层和附加的元数据组成,这些层可以独立重用和缓存。
StackGres支持多少个Postgres扩展?
StackGres目前支持近200个Postgres扩展,并计划持续增加。
使用OCI镜像有什么安全性优势?
OCI生态系统提供了图像安全扫描工具和数字签名功能,增强了扩展的安全性。
Postgres扩展的安全风险有哪些?
Postgres扩展可能来自不受信任的代码,存在崩溃、数据损坏或丢失的风险。
如何利用OCI生态系统来构建Postgres扩展?
OCI生态系统提供了多种工具和基础设施,简化了构建、打包和分发Postgres扩展的过程。