如何在macOS上构建多平台Docker镜像?解决构建失败问题
解决Mac上构建多平台Docker镜像失败的问题
问题背景
在Mac M1 Max上尝试构建支持linux/amd64和linux/arm64的多平台Docker镜像失败,且直接用标准命令构建单平台镜像时,因基础镜像为x86_64架构,无法在arm64的Mac上运行。
执行的构建命令
docker buildx build --platform linux/amd64,linux/arm64 -t brandojazz/lean-dojo:latest --push .
错误日志
❯ docker buildx build --platform linux/amd64,linux/arm64 -t brandojazz/lean-dojo:latest --push . [+] Building 0.0s (0/0) docker:desktop-linux ERROR: Multi-platform build is not supported for the docker driver. Switch to a different driver, or turn on the containerd image store, and try again. Learn more at https://docs.docker.com/go/build-multi-platform/
使用的Dockerfile
# 使用特定版本的kitware/cmake作为基础镜像 FROM kitware/cmake:ci-clang_cxx_modules-x86_64-2023-02-15 # 安装所需包:which、GMP库开发文件、Python3和pip RUN yum -y install which gmp-devel python3 python3-pip # 创建python3到/usr/bin/python的符号链接以兼容 RUN ln -s $(which python3) /usr/bin/python # 安装Python包:toml用于解析TOML文件,loguru用于日志,tqdm用于进度条 RUN pip3 install toml loguru tqdm # 设置环境变量ELAN_HOME存储Elan的安装目录 ENV ELAN_HOME="/.elan" # 将ELAN_HOME/bin添加到PATH以便访问Elan的二进制文件 ENV PATH="${ELAN_HOME}/bin:${PATH}" # 下载并静默执行Elan安装脚本,自动确认 RUN curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh -sSf | bash -s -- -y # 修改/.elan目录权限为可写 RUN chmod -R a+w /.elan # 设置容器工作目录为/workspace WORKDIR /workspace # 修改/workspace目录权限为可写 RUN chmod -R a+w /workspace
解决方案
1. 切换到支持多平台构建的Buildx驱动
默认的docker驱动不支持多平台构建,需创建并使用docker-container驱动:
# 创建新的builder实例并设为当前使用 docker buildx create --name multi-platform-builder --use # 初始化并检查builder状态 docker buildx inspect --bootstrap
2. 适配Dockerfile与构建命令
方案A:替换为多平台基础镜像
如果kitware/cmake提供了支持多平台的镜像标签,将Dockerfile中的基础镜像行修改为不带架构后缀的版本(需确认该标签支持linux/amd64和linux/arm64):
FROM kitware/cmake:ci-clang_cxx_modules-2023-02-15
方案B:保留原基础镜像,依赖QEMU模拟
Mac M1上的Docker Desktop默认已启用QEMU架构模拟,切换到新的builder后,直接重新执行原构建命令即可:
docker buildx build --platform linux/amd64,linux/arm64 -t brandojazz/lean-dojo:latest --push .
3. 验证镜像架构
推送完成后,可通过以下命令确认镜像支持的平台:
docker buildx imagetools inspect brandojazz/lean-dojo:latest
若需单独构建某一架构的镜像,可执行:
# 构建x86_64架构镜像 docker build --platform linux/amd64 -t brandojazz/lean-dojo:amd64 . # 构建arm64架构镜像 docker build --platform linux/arm64 -t brandojazz/lean-dojo:arm64 .
内容的提问来源于stack exchange,提问作者Charlie Parker
相关产品推荐
相关产品推荐

