Docker Compose V2.25 正式发布:多架构镜像批量构建功能上线​

摘要: Docker Compose V2.25 正式发布:告别繁琐,一键搞定多架构镜像构建!

Docker Compose V2.25 来了!如果你还在为同时给 Apple Silicon (M1/M2) 和 Intel/AMD 服务器构建不同架构的镜像而头疼,那么这次更新绝对是你的福音。

这次更新的核心亮点,就是 docker compose build 命令终于原生支持了 --platform 参数。这意味着,你可以用一条命令,批量为所有在 docker-compose.yml 文件中定义的服务,一次性构建出支持多种 CPU 架构(如 linux/amd64 和 linux/arm64)的镜像。

告别复杂的脚本和繁琐的手动操作,一个更高效、更统一的开发工作流正在向你招手。

核心亮点:build 命令的 --platform 革命

在深入了解这个新功能之前,我们先快速回顾一下那个“不堪回首”的过去。

痛点回顾:曾经我们如何构建多架构镜像?

试想一下这个场景:你的团队里,一半人用着最新的 M2 MacBook Pro (ARM64),另一半人则使用着 Windows/Linux 的 x86 电脑 (AMD64)。而你们的生产服务器,清一色是 AMD64 架构的。

为了确保代码在所有环境下都能跑起来,你需要为同一个应用构建至少两种架构的 Docker 镜像。在 V2.25 之前,这通常意味着:

  1. 手动 buildx:你需要为每个服务单独执行 docker buildx build --platform linux/amd64,linux/arm64 ... 命令,参数又长又难记。
  2. 编写 Shell 脚本:将上述 buildx 命令封装到脚本里,但这增加了维护成本,且不够优雅。
  3. 复杂的 CI/CD 配置:在 GitLab CI 或 GitHub Actions 中设置复杂的矩阵构建(Matrix Build),为不同架构分别执行构建任务。

无论哪种方式,都显得有些笨拙和低效。

解决方案:全新的 docker compose build --platform

现在,Docker Compose V2.25 把这一切都简化了。

你只需要在执行 docker compose build 命令时,加上 --platform 参数,并指定你想要构建的目标平台列表(用逗号分隔)。Compose 会自动调用底层的 Buildx,为你处理所有服务的跨平台构建任务。

重要提示:这个功能依赖于 Docker Engine 中的 Buildx 组件。幸运的是,如果你正在使用 Docker Desktop,Buildx 已经为你预装并配置好了。

实战演练:一个简单的 docker-compose.yml 示例

假设你有一个包含 backend 和 frontend 两个服务的项目。

你的 docker-compose.yml 文件可能长这样:

version: '3.8'
services:
  backend:
    build:
      context: ./backend
    image: my-registry/my-app-backend:latest
    ports:
      - "8080:8080"
  frontend:
    build:
      context: ./frontend
    image: my-registry/my-app-frontend:latest
    ports:
      - "3000:3000"

过去,你需要为 backend 和 frontend 分别执行 docker buildx 命令。

现在,你只需要在项目根目录下运行这一条命令:

# 同时为 amd64 和 arm64 架构构建所有服务的镜像
docker compose build --platform linux/amd64,linux/arm64

执行完毕后,Docker 会在本地生成一个 manifest list(清单列表),它同时包含了 linux/amd64 和 linux/arm64 两个平台的镜像层。

更关键的是,你可以直接推送这个多架构镜像:

# 将构建好的多架构镜像推送到镜像仓库
docker compose push

当其他用户(无论使用 M1 芯片还是 Intel 芯片)拉取 my-registry/my-app-backend:latest 这个镜像时,Docker 会自动根据当前机器的 CPU 架构,下载对应版本的镜像。

是不是感觉清爽多了?整个流程被惊人地简化了。

除了多架构构建,还有哪些值得关注的更新?

当然,V2.25 的更新不止于此。这里还有几个值得你关注的改进:

  • watch 命令的稳定性增强:docker compose watch 是一个开发利器,可以监控文件变化并自动重建、重启服务。新版本修复了在某些场景下可能导致服务崩溃或无响应的 bug,让热重载体验更丝滑。
  • cp 命令的体验优化:docker compose cp 用于在本地和容器之间拷贝文件。新版本改进了其性能和对符号链接(symlinks)的处理,拷贝大文件或复杂目录结构时更可靠。
  • 错误信息更友好:优化了部分命令失败时的错误提示,让你能更快地定位问题所在。

如何升级到 Docker Compose V2.25?

升级过程非常简单。

如果你正在使用  Docker Desktop,它通常会自动为你更新。你可以在终端运行以下命令来检查当前版本:

docker compose version

如果版本低于 V2.25,可以手动检查 Docker Desktop 的更新。

总结:为什么这次更新对你很重要?

Docker Compose V2.25 的发布,尤其是 --platform 参数的加入,不仅仅是一个小功能的增加。它标志着 Docker 官方正在努力统一和简化跨平台开发的完整工作流。

对于开发者而言,这意味着:

  • 效率提升:告别繁琐脚本,用一条原生命令解决核心痛点。
  • CI/CD 流程简化:构建多架构镜像的流水线配置可以变得极其简单。
  • 团队协作更顺畅:无论团队成员使用什么硬件,都能共享一套统一的构建流程。

如果你还没有升级,现在就是最好的时机。去体验一下 docker compose build --platform 带来的便利吧!

FAQ (常见问题)

Q1: 使用 docker compose build --platform 还需要手动安装 Docker Buildx 吗?

 A: 不需要。如果你使用的是现代版本的 Docker Desktop (Windows, Mac, or Linux),Buildx 已经作为默认的构建器集成在内了。你只需要确保 Docker Engine 是最新版本即可。

Q2: 同时构建多个平台会不会让构建速度变慢? 

A:  会的。因为 Docker 需要为每个目标平台分别编译和构建。例如,在 M1 Mac (ARM64) 上交叉编译一个 AMD64 镜像,会使用 QEMU 进行指令集模拟,这比原生构建要慢得多。建议在 CI/CD 服务器上执行多平台构建任务。

Q3: 我如何确认我推送的镜像是多架构的? 

A: 你可以使用 docker buildx imagetools inspect 命令来查看一个远程镜像的 manifest。例如:docker buildx imagetools inspect my-registry/my-app-backend:latest。在输出结果中,你应该能看到它包含的所有平台(PLATFORM)列表。

Q4: 是不是所有的基础镜像(Base Image)都支持多架构构建? 

A: 不一定。这是一个非常关键的点。你的 Dockerfile 中使用的基础镜像(如 FROM node:18 或 FROM python:3.10) 必须本身就是多架构镜像。幸运的是,几乎所有官方镜像(如 node, python, golang, ubuntu 等)都已经支持多架构。如果你使用了一些小众的第三方镜像,需要先确认其是否支持你需要的平台。