Apple Silicon(M1 Max)上Spring Boot Buildpacks构建amd64镜像失败
M1 Max构建Linux/amd64 Spring Boot Docker镜像失败解决办法
问题背景
从Intel架构MacBook更换为M1 Max设备后,使用Spring Boot Maven插件或直接通过pack命令构建部署到Linux服务器的linux/amd64架构Docker镜像时失败,报错提示镜像摘要找不到。已启用Rosetta,环境为Spring Boot 3.4.4、Docker Desktop 4.39.0。
核心报错信息
[INFO] [creator] ERROR: failed to export: saving image: failed to fetch base layers: saving image with ID "sha256:0c5ac79d549c4b077a7d857631f817f8b573f5da2c109a51f320ee584d44d3f2" from the docker daemon: Error response from daemon: unable to create manifests file: NotFound: content digest sha256:05cbce61634362ddc82e0d3ce86a6c812f0b2423070acecd8819c035ef8be68d: not found [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.4.4:build-image (default-cli) on project my-project: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:3.4.4:build-image failed: Builder lifecycle 'creator' failed with status code 62 -> [Help 1]
解决步骤
1. 清理Docker缓存
跨架构构建时旧缓存易导致层摘要不匹配,执行以下命令彻底清理:
docker system prune -a -f
2. 确认Docker Desktop的Rosetta仿真配置
打开Docker Desktop -> 设置 -> Features in development,确保Use Rosetta for x86/amd64 emulation on Apple Silicon选项已勾选(即使已安装Rosetta,Docker可能未启用该仿真)。
3. 强制拉取最新构建器镜像
无论是用Spring Boot插件还是pack命令,都强制拉取最新的构建器镜像,避免旧镜像的架构兼容问题:
- 对于
pack命令,添加--pull-policy always参数:pack build --platform linux/amd64 --builder paketobuildpacks/builder-jammy-java-tiny:latest --pull-policy always --path target/my-app-1.1.0-SNAPSHOT.jar my-project - 对于Spring Boot Maven插件,在pom.xml的
image配置中加入拉取策略:<image> <name>${MODULE_DOCKER_IMAGE_NAME}</name> <publish>${MODULE_DOCKER_PUBLISH}</publish> <imagePlatform>${MODULE_DOCKER_PLATFORM}</imagePlatform> <pullPolicy>ALWAYS</pullPolicy> </image>
4. 改用Docker Buildx构建
如果上述方法无效,尝试用Docker官方的Buildx工具直接构建:
- 创建并使用Buildx构建器:
docker buildx create --use - 编写基础Dockerfile(放在项目根目录):
FROM eclipse-temurin:21-jre-jammy COPY target/my-app-1.1.0-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"] - 执行构建命令:
docker buildx build --platform linux/amd64 -t ***/my-image:1.1.0 . --load
5. 调整Docker Desktop版本
部分Docker Desktop新版本存在跨架构构建bug,可尝试降级到4.38.x版本,或升级到最新稳定版测试。
内容的提问来源于stack exchange,提问作者gWombat
相关产品推荐
相关产品推荐

