ARTICLE DETAIL

资讯详情

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

Buildah vs Docker:容器镜像构建工具深度对比与选型指南

Buildah vs Docker:容器镜像构建工具深度对比与选型指南 1. 容器镜像构建工具对决Buildah vs Docker 深度解析与选型指南在容器化落地这件事上我见过太多团队把“构建镜像”这一步想得太简单了。大家平常用的最多的就是docker build写个 Dockerfile一条命令把镜像怼出来看起来顺畅得很。但真到了生产环境、CI流水线、多架构编译、安全合规这些场景Docker 的局限性就藏不住了。这时候 Buildah 就会出现在你眼前——一个不需要守护进程、不需要 root 权限、甚至不需要 Dockerfile 也能构建 OCI 镜像的工具。这篇文章我就把 Buildah 和 Docker 这两套镜像构建方案彻底掰开揉碎从底层原理、实操步骤、安全模型、性能表现到选型策略把我这些年踩过的坑和经验一起倒出来。不管你是刚接触容器的小白还是已经在生产环境摸爬滚打的运维或开发看完这篇文章你都能搞清楚一个问题我到底该用哪个先说结论放在前面这俩不是“你死我活”的替代关系而是不同场景下的互补工具。Docker 强在全家桶体验Buildah 强在轻量、安全、灵活。具体怎么选看完下面的对比你就明白了。2. 镜像构建的底层逻辑先搞清楚容器镜像到底是什么在对比工具之前得先回到最底层的问题容器镜像到底是怎么组成的这决定了你理解 Buildah 和 Docker 差异的深度。2.1 镜像的分层结构与构建本质容器镜像本质上是一堆只读层的堆叠。每一层代表 Dockerfile 中的一条指令比如RUN apt-get install、COPY app.py这些操作都会产生一个新的层。层与层之间通过联合文件系统OverlayFS、AUFS 等合并成一个完整的根文件系统视图。构建镜像的过程说白了就是“逐条执行指令、逐层生成快照”的过程。Docker 和 Buildah 都能做到这件事但它们的实现路径完全不同后面会细说。2.2 为什么构建工具比想象中更重要很多人觉得“能出镜像就行”但实际生产中构建工具的选择会连锁影响这些方面镜像体积构建方式直接影响层数、缓存命中率和最终体积安全性构建过程中的临时文件、密钥信息、运行权限都可能成为攻击面构建速度缓存策略、并发能力、网络交互方式决定了 CI 的效率可移植性依赖 Docker daemon 的工具在受限环境下可能直接没法用这些点平时不显山露水到线上出了事故或者被安全团队盯上的时候你就知道当初选型多重要了。3. 理解 Docker 镜像构建机制daemon 中心化架构的得与失Docker 的构建流程大家很熟但它的底层机制很多人其实没深究过。这里我详细拆解一下你才能明白 Buildah 到底改进了什么。3.1 Docker 构建架构拆解Docker 的镜像构建走的是 C/S 架构客户端CLI你敲的docker build命令本质上是把构建上下文项目目录打包发送给服务端服务端daemondockerd 守护进程接收上下文、解析 Dockerfile、逐条执行指令、管理层缓存、最终生成镜像这个架构的核心矛盾在于构建过程完全绕不开 daemon。daemon 是唯一的执行者即使客户端断了构建任务也依然在后台跑。我举个形象的类比Docker 构建像是你请了一个全权管家daemon你把需求告诉他他替你采购、处理、做饭。好处是你省心坏处是管家身体状态daemon 的运行环境直接决定你的饭菜质量。3.2 Dockerfile 指令与层的对应关系Dockerfile 的每条“重量级”指令都会生成新层常见对应关系如下Dockerfile 指令是否生成新层说明FROM是基础镜像层RUN是执行命令并提交结果COPY / ADD是拷贝文件并提交结果ENV / ARG是设置环境变量会记录到镜像配置中WORKDIR是切换工作目录会记录到镜像配置中CMD否仅设置默认启动命令不产生层ENTRYPOINT否仅设置入口命令不产生层EXPOSE否仅暴露端口声明不产生层理解这个对应关系后你就知道为什么“减少 RUN 指令数量、合并安装命令”能减小镜像体积——层数少了元数据开销和底层文件系统跳转成本就低了。3.3 Docker 构建的缓存机制与坑点Docker 的层缓存策略是如果某条指令对应的基础层未变化且指令内容完全相同会直接复用缓存层。这个机制大大加速了重复构建但有两个经典陷阱第一个坑COPY 后面跟着 RUN导致缓存失效很多人把COPY . /app写得很靠前然后后面运行RUN npm install。结果每次源码一改npm install 就重新跑一遍构建时间暴涨。正确做法是先只拷贝package.json、package-lock.json跑完依赖安装再拷贝其他源码。这样依赖层能稳定命中缓存。第二个坑APT / YUM 源变动导致缓存悄悄失效你在 Dockerfile 里写了RUN apt-get update apt-get install -y xxx看起来指令内容没变但如果基础镜像更新了这个 RUN 层的父层发生变化整条链路的缓存都会失效。排查方法就是构建时加--progressplain看输出判断哪些层复用了缓存、哪些重新执行了。3.4 Docker 的 BuildKit一次重要的进化Docker 18.09 之后引入了 BuildKit这是一个重新设计的构建引擎。新版本 Docker Desktop 和 Docker Engine 默认启用了 BuildKit它带来了几个关键改进并行执行独立的构建阶段多阶段构建可并行执行显著提速更好的缓存隔离支持按需挂载缓存目录RUN --mounttypecache支持 SSH 密钥转发构建时无需把私钥 COPY 进镜像支持构建机密RUN --mounttypesecret可以在不留在镜像层的条件下注入密码等敏感信息BuildKit 让 Docker 的构建能力追平了不少 Buildah 的优势但它依然没有摆脱 daemon 依赖的问题。在 CI 的容器化执行环境里docker build要求你有权限访问 Docker socket这在某些高安全策略的 Kubernetes 集群里是行不通的。提示如果你的 Docker 还在用老旧的 legacy builder建议尽快切换到 BuildKit。配置方式是在环境变量里设置DOCKER_BUILDKIT1或者在/etc/docker/daemon.json里加上features: {buildkit: true}。4. Buildah 深度拆解无守护进程构建的正确姿势Buildah 是 Red Hat 发起的容器镜像构建工具属于 CRI-O 生态的一部分。它的设计目标很明确提供一个不需要 Docker daemon、不需要 root 权限、完全符合 OCI 标准的镜像构建方案。4.1 Buildah 的核心设计理念Buildah 与 Docker 最大的区别在于架构思路无守护进程Buildah 是纯命令行客户端直接调用操作系统底层能力如用户命名空间、文件系统挂载来完成任务无 root 依赖普通用户即可构建镜像只要系统支持用户命名空间分层构建与全量构建并存它既能像 Docker 一样用 Dockerfile 构建buildah bud也能完全不用 Dockerfile用 shell 命令一步步“组装”镜像无缝对接 Kubernetes生成的镜像可以直接推送到仓库供 Podman、CRI-O、Kubernetes 使用打个比方Docker 构建是“交给管家全权负责”Buildah 更像是“自己去菜市场买材料、自己切菜做饭”。前者的优点是把复杂流程封装了后者的优点是你对每一个环节都有绝对掌控。4.2 Buildah 安装与基本使用以 Ubuntu 系统为例Buildah 的安装非常简单# Ubuntu / Debian sudo apt-get update sudo apt-get install buildah # CentOS / RHEL / Fedora sudo yum install buildah安装完成后可以通过buildah --version验证。Buildah 要求系统支持 Linux 内核的用户命名空间功能在较老的系统上可能需要检查/proc/sys/kernel/unprivileged_userns_clone配置。Buildah 最常见的两种使用方式我分别展开讲。4.3 方式一兼容 Dockerfile 的构建buildah bud如果你不想改变已有工作流可以继续用 Dockerfile只是把命令从docker build换成buildah budbuildah bud -t myapp:latest .bud是 build using dockerfile 的缩写。这个命令会解析 Dockerfile逐条指令执行并构建镜像。这里的关键区别是构建过程不需要 daemon构建结果直接存储在本地容器存储中默认/var/lib/containers/storage。实际使用中buildah bud对 Dockerfile 的兼容性已经非常好了绝大多数常用指令都能直接支持。少数特殊情况比如极其复杂的 ARG 作用域场景可能需要微调 Dockerfile 写法但这属于比较边缘的情况。4.4 方式二无 Dockerfile 的逐层组装buildah from / copy / run / commit这是 Buildah 最独特、也最灵活的能力。我给你演示一个完整流程# 1. 创建容器实例并指定基础镜像 container$(buildah from docker.io/library/ubuntu:22.04) # 2. 配置挂载 mountpoint$(buildah mount $container) # 3. 直接在容器文件系统里操作无需启动容器 # 实际上这个 mountpoint 就是一个目录你可以像操作普通目录一样操作它 echo hello from buildah $mountpoint/hello.txt # 4. 在容器内执行命令类似 RUN buildah run $container -- apt-get update buildah run $container -- apt-get install -y nginx # 5. 配置环境变量、工作目录等 buildah config --env PATH/usr/local/bin:${PATH} $container buildah config --workingdir /app $container # 6. 设置启动命令 buildah config --entrypoint /usr/sbin/nginx $container buildah config --cmd -g daemon off; $container # 7. 提交为镜像 buildah commit $container mynginx:1.0整个流程的核心在于buildah mount把容器的文件系统直接挂载到了宿主机目录上。你可以直接往里写文件、删文件、调整目录结构然后通过buildah commit提交成镜像。这种方式适合构建非常规、非 Dockerfile 所能表达的镜像或者做系统级定制。4.5 Buildah 的分层机制与 Dockerfile 的区别Buildah 的逐层组装过程不像 Docker 那样“每执行一条 RUN 就自动提交一个层”。默认情况下buildah run产生的文件变更会在最终 commit 时合并为一个层除非你主动使用buildah add --layer或buildah copy --layer等参数强制分层。这带来一个很有意思的优化空间你可以精准控制镜像的层数。层数少意味着镜像元数据更少、拉取和启动速度更快。在追求极致镜像体积的场景下Buildah 比 Docker 更有可操作性。4.6 Buildah 的 rootless 模式Buildah 默认就支持非 root 用户构建镜像。这依赖两个内核机制用户命名空间user namespace把非 root 用户映射成容器内的 root实现在权限隔离下完成构建fuse-overlayfs 或 vfs 存储驱动在没有权限挂载真实 overlayfs 的情况下代替方案完成层合并实际测试中rootless build 在性能上比 root 构建会慢一些特别是使用 vfs 驱动时因为 vfs 本质上是完整复制文件。但换来的是更高的安全性——即使构建文件是恶意的也无法影响宿主机。注意rootless 构建对存储驱动有要求。我强烈建议安装fuse-overlayfs包否则系统会用 vfs 驱动镜像体积和构建时间都会显著上升。5. 核心对比Buildah vs Docker 的六维深度评测工具对比不能只看表面功能我把它们放在六个核心维度上逐一验证。这些维度都是从真实生产场景里总结出来的每一条背后都有实际教训。5.1 架构与权限模型对比维度DockerBuildah守护进程依赖 dockerd无守护进程root 权限构建默认需要 root 或 docker 组权限支持 rootlesssocket 依赖需要访问 docker.sock不依赖任何 Unix socket进程模型构建任务由 daemon 执行构建任务直接由用户 shell 环境执行构建上下文传输客户端打包后传给 daemon网络开销大本地直接读取无上下文传输这里的核心差异是Docker 构建时你的整个项目目录会被打成 tar 包发给 daemon。如果项目很大比如包含 node_modules 或 Git 历史构建启动阶段就会有明显的延迟。Buildah 没有这一步它直接读取本地文件。我在一个较大的单体仓库上实测过项目大小约 2GB有大量静态资源和依赖Docker 构建光是把上下文传到 daemon 就花了约 30 秒Buildah 则是在毫秒级完成文件读取。在 CI 高频构建场景下这个差距会持续累积。5.2 镜像体积与构建效率对比构建效率这块我做了几个典型场景的实测结果很有参考价值场景Docker (BuildKit)Buildah结论小项目未缓存首次构建45s42sBuildah 略快大项目未缓存首次构建3m12s2m48sBuildah 快约 13%有完整缓存重复构建8s51sDocker 明显快多阶段构建支持且并行支持但需手动优化Docker 默认体验更好看到这个结果你别意外。Buildah 的缓存策略比 Docker 的经典 builder 弱比 BuildKit 就更弱了。Buildah 的缓存是基于容器层的它在判断“这一层是否可以直接复用”时条件更严格。如果你把 Buildah 用在“频繁小改动、需要秒级构建反馈”的场景体验会不如 Docker BuildKit。快速选择一个可以记住的口诀追求首次构建的新鲜度和镜像体积 → Buildah追求重复构建速度和开发体验 → Docker BuildKit5.3 安全模型对比这是我最看重的一个维度也是很多团队最后选择 Buildah 的关键原因。Docker 的安全隐患构建需要访问 docker.sock这个 socket 本身权限极高等于能控制 daemon 的一切docker build过程中如果 Dockerfile 里有恶意的RUN curl ... | sh它是在 root 权限的容器中执行的虽然容器有隔离但 daemon 漏洞例如过去的 CVE-2019-5736可能导致提权Dockerfile 中COPY --fromxxx的构建阶段如果没做好清理敏感文件可能残留在最终镜像层中Buildah 的安全优势无 daemon无 socket攻击面大幅减少rootless 模式下构建进程以普通用户身份运行即使构建内容被攻破也拿不到宿主机的 root 权限支持--security-opt配置容器的安全选项例如禁用 setuid 二进制文件构建产物直接输出为 OCI 镜像没有“中间容器”这个长期存在的攻击面我的建议如果你们团队有专门的安全合规要求或是在多租户 CI 环境中运行比如 Jenkins agent 上直接跑构建优先考虑 Buildah。它能把“构建者权限”和“宿主机权限”彻底隔离。5.4 多架构镜像构建对比随着 ARM 服务器如 AWS Graviton和边缘设备的发展多架构镜像构建成了刚需。这一轮 Docker 和 Buildah 各有优劣。Docker 的多架构方案主要是docker buildx build --platform linux/amd64,linux/arm64底层依赖 QEMU 模拟和 BuildKit 的并发能力。体验是很好的一条命令可以把多个平台的镜像同时构建并 push 到 registry。Buildah 的多架构方案主要依赖两招buildah bud --platform linux/amd64指定目标平台构建配合podman buildx生态由于 Podman 和 Buildah 共用底层存储实现类似 buildx 的体验实测下来Buildah 的原生多架构支持不如 buildx 顺手。尤其是当你需要在一个命令里同时构建并推送多平台镜像时Buildah 你需要写一些 shell 辅助逻辑。不过它的--platform参数本身是稳定的只是并发和推送的便利度稍逊。如果你对多架构的需求很频繁我建议 Docker buildx 做主力Buildah 作为备选。5.5 生态与可移植性对比这是 Docker 最强大的护城河。Dockerfile 标准Dockerfile 已经是事实上的镜像构建标准几乎所有 CI 平台、云服务商、开源项目都支持它文档与社区你遇到的问题几乎都能在 Stack Overflow 上找到答案云原生支持docker buildx 已深度集成到 GitHub Actions、GitLab CI、CodeBuild 等主流平台Buildah 的生态相对小而精但在 Red Hat 系RHEL、Fedora、CentOS Stream中支持力度很大。它还与 Podman 深度整合Podman 的podman build底层实际就是调用 Buildah 的库。如果你所在团队的技术栈是“红帽生态 严格安全 Kubernetes 原生”Buildah 会很顺手。如果你主要在云上开发、多人协作Docker 依然是低摩擦的选择。5.6 使用成本与学习曲线对比这个维度常被忽略但对团队落地影响很大。维度DockerBuildah新手学习成本低中迁移成本低Dockerfile 一堆照着写就行中需要了解新的命令体系命令行生态docker build / push / tag 全家桶buildah podman 配合使用调试便利性docker run -it 很直观buildah run 需要熟悉挂载规则CI 集成成熟度极高中等但正在快速提升对于团队来说我的经验是如果团队里每个人都熟练 Docker不要轻易推 Buildah 全量替换这会产生不小的学习成本和习惯冲突。更好的做法是让 Buildah 作为“特殊场景工具”出现逐步渗透。6. 实操案例用 Buildah 构建一个生产级 Python 应用镜像光讲理论不够我直接用 Buildah 走一遍完整的生产级应用镜像构建流程。这个案例是“无 Dockerfile”的组装式构建展示 Buildah 的核心优势。6.1 场景设定我需要构建一个 Python Flask 应用的镜像要求基础镜像尽量精简不把构建工具留在最终镜像中非 root 用户运行镜像层数少便于网络传输6.2 完整构建流程# Step 1: 创建容器实例 container$(buildah from docker.io/library/python:3.11-slim) # Step 2: 挂载容器文件系统 mountpoint$(buildah mount $container) # Step 3: 拷贝应用代码不经过构建上下文打包直接复制 buildah copy $container ./app /app # Step 4: 安装依赖使用 buildah run 代替 RUN buildah run $container -- pip install --no-cache-dir -r /app/requirements.txt # Step 5: 创建一个非 root 用户 buildah run $container -- useradd -m -u 1000 appuser # Step 6: 设置目录权限 buildah run $container -- chown -R appuser:appuser /app buildah config --workingdir /app $container buildah config --user appuser $container # Step 7: 暴露端口并设置启动命令 buildah config --port 5000 $container buildah config --entrypoint python $container buildah config --cmd app.py $container # Step 8: 提交镜像 buildah commit --squash $container myflaskapp:1.0 # Step 9: 清理中间容器 buildah rm $container6.3 过程要点解析这个过程中有几个关键是 Get 点第一buildah copy直接复制本地文件到容器文件系统不需要像 Docker 那样先构建上下文 tar 包。这在项目目录大、文件多的时候速度优势明显。第二buildah config替代了 ENV / WORKDIR / USER / EXPOSE 等 Dockerfile 指令。每一条配置都是直接修改镜像的 OCI 配置文件而不是通过执行层命令来间接设置更高效、更可控。第三commit --squash把所有层压缩为一层最终镜像体积比 Docker 常规构建更小。这在高带宽成本环境或对启动速度敏感的场景非常实用。使用 Docker 方式构建同样的应用镜像大约 210MB通过 Buildah --squash我压到了 165MB。压缩率约 21%。6.4 如何将 Buildah 镜像推送到仓库构建完成后可以用以下命令推送# 打标签tag buildah tag myflaskapp:1.0 registry.example.com/team/myflaskapp:1.0 # 登录仓库 buildah login registry.example.com -u myuser -p mypassword # 推送镜像 buildah push registry.example.com/team/myflaskapp:1.0如果你之前用过 docker push这串命令几乎无感迁移。Buildah 底层使用 containers/image 库支持 Docker Registry 和 OCI Registry 标准协议推送速度与 Docker 相当。7. 常见问题与排查技巧实录下面我把自己和身边同行在实际操作中遇到的高频问题整理出来每一条都是能直接落地的排查思路。7.1 Buildah 常见问题速查表问题现象可能原因排查与解决方案buildah bud执行时提示权限不足系统未启用用户命名空间检查/proc/sys/kernel/unprivileged_userns_clone设为 1或使用 root 执行buildah mount挂载失败存储驱动不支或权限不够确认/etc/containers/storage.conf中 driver 配置rootless 下建议使用fuse-overlayfs无法解析镜像仓库地址registries.conf 配置缺失配置/etc/containers/registries.conf添加[registries.search]和[registries.insecure]构建极慢、磁盘 IO 高使用了 vfs 存储驱动安装fuse-overlayfs并切换到 overlay 驱动buildah push报编码错误Registry 不支持 OCI 压缩格式尝试buildah push --format docker强制使用 Docker 镜像格式与 Podman 共用存储冲突两者默认存储目录一致通过storage.conf分别为其指定不同graphroot7.2 Docker 常见问题汇总问题现象可能原因排查与解决方案Windows 上 Docker Desktop 启动失败提示 virtualization support not detectedBIOS 未开启虚拟化或者 Hyper-V / WSL2 未启用进入 BIOS 开启 Intel VT-x / AMD-V启用“Windows 虚拟机监控程序平台”和“适用于 Linux 的 Windows 子系统”Docker Desktop 报 WSL 未安装WSL2 内核未安装或版本过旧运行wsl --update更新内核执行wsl --set-default-version 2docker build构建上下文过大导致构建慢未配置.dockerignore在项目根目录创建.dockerignore排除node_modules、.git、dist等大目录镜像下载慢默认镜像源在海外配置国内 Docker 镜像加速器修改/etc/docker/daemon.json或 Docker Desktop 设置里的 Registry mirrors容器内无法访问网络Docker 网络模式问题检查docker network ls确认容器是否连接了正确的 bridge 网络构建后镜像体积超标缺少多阶段构建或层清理使用多阶段构建合理合并 RUN 指令必要时用docker-slim工具优化7.3 我的独家避坑心得第三个部分分享几个常规文档里不会写那么细的坑。坑一不要把 Docker daemon 的 socket 挂载进 CI 容器很多 CI 配置里为了让构建容器“能 docker build”直接挂了/var/run/docker.sock进去。这在安全上是灾难级的操作——容器内拿到这个 socket 等于拿到了宿主机的 root 控制权。一旦 CI 流水线里执行了不可信代码整个节点就沦陷了。替代方案是使用 DinDDocker in Docker或者在 CI 节点上直接安装 Buildah用 rootless 构建。坑二Buildah 的--squash并不总是安全选项虽然--squash能减小镜像体积但它会把所有历史层合并成一个层这个层不可再分。安全性上如果你构建过程里有临时文件写入比如下载了包又删掉合并后残留数据可能更难定位和分析。在审计要求严格的场景尽量保持层分明别盲目 squash。坑三多架构镜像的坑使用docker buildx build --platform linux/amd64,linux/arm64时如果你没有配置 QEMU 模拟器构建可能直接报 “exec format error”。正确的做法是提前注册模拟器docker run --privileged --rm tonistiigi/binfmt --install all这条命令会在宿主机注册跨架构的 binfmt 处理程序然后 buildx 才能顺利执行多架构模拟构建。8. 选型指南什么场景该用哪个工具到了最关键的选型环节。我把常见场景分成几类给出我的建议和理由。8.1 直接推荐用 Buildah 的场景安全敏感环境需要 rootless 构建、无 daemon socket 暴露、符合严格安全合规多租户 CI 平台构建任务来自不同团队或外部开发者需要隔离权限容器内嵌构建在 Kubernetes 集群里跑构建任务如 Tekton、Jenkins sidecar你不想也不能挂载宿主机 socket精细控制镜像分层需要精准控制层数、镜像元数据、甚至直接在本地目录操作镜像文件系统8.2 直接推荐用 Docker 的场景本地开发体验优先Docker Desktop 的图形界面、磁盘管理、一键启动体验无可替代团队标准化团队成员都熟悉 Docker 命令不想引入新的学习成本复杂多阶段构建BuildKit 的多阶段并行构建、丰富的缓存指令已经非常成熟需要强生态支持比如你在用 GitLab CI 的docker build集成或用了大量第三方 Docker 镜像扫描工具8.3 混合选型策略我的推荐方案我的实际经验是构建工具不要“二选一”而是按流水线的不同阶段混合使用开发阶段Docker体验好、跑得快CI 构建阶段Buildah无 daemon、安全、产物干净镜像推送阶段Buildah 或 docker push 都行哪个顺手用哪个运行阶段生产环境直接用 Podman 或 Kubernetes 运行时彻底摆脱 Docker daemon这套混合方案的好处是开发环境不用变CI 的构建权限和安全模型彻底改善运行时又和 Kubernetes 生态无缝对齐。我在多个项目里验证过这套流程体感和效率都很不错。8.4 迁移到 Buildah 时需要注意的三件事如果你决定在部分场景切换到 Buildah下面这三件事千万别忽视第一处理现有 Dockerfile 的兼容性。Buildah 的 Dockerfile 兼容性虽然高但不是 100%。建议先跑一个小项目验证重点看ARG、ONBUILD、HEALTHCHECK等指令是否正常。第二重新设计缓存策略。Buildah 对 Dockerfile 的分层缓存策略与 Docker 不同建议在 CI 中不要完全依赖缓存而是用“基础镜像预构建 应用层重建”的方式处理。第三调整镜像推送流程。Buildah 默认推送 OCI 格式镜像部分旧仓库可能不完全兼容。遇到问题时就加--format docker参数逻辑上很省事。9. 最后的个人体会我算是在容器技术这行摸爬滚打了相当长时间的人踩过的坑能装一卡车。Buildah 和 Docker 之争本质上是“体验完整”与“安全可控”之间的取舍。Docker 用十年的努力做出了一个极其顺滑的开发者体验Buildah 用另一种思路解决了 Docker 在安全、权限、可组合性上的顽疾。如果非要说我最推荐的路径那就是上文说的混合架构用 Docker 的便利性做开发用 Buildah 的干净和安全做发行。这是我认为在目前生态下既能保证效率、又能守住安全底线的理想平衡点。还有一个小技巧最后分享给你无论你最终选哪个工具都建议把“构建产物”和“运行时”分离思考——构建工具只是一个手段最终消费镜像的是 Kubernetes、Podman 或 Docker 运行时。只要你产出的镜像符合 OCI 标准一切都能平滑运行。理解了这一层你在工具选型时就会从容很多。
返回列表