如何在Gitlab Runner上构建适配ARM架构的OpenJDK16+ Docker镜像
问题成因
该报错由架构不匹配导致:
你当前使用的GitLab Runner运行在linux/amd64(x86服务器)架构环境下,Docker默认会优先拉取和当前运行环境架构匹配的镜像。你之前使用的arm32v7/adoptopenjdk:14镜像比较特殊,仓库中同时上传了amd64、arm32v7两种架构的镜像清单,因此x86环境下可以正常拉取、构建。
而AdoptOpenJDK 16及更高版本的arm32v7/前缀镜像,官方仅上传了arm32v7架构的版本,没有提供对应amd64架构的镜像,因此x86环境下拉取时会触发报错:
no manifest for linux/amd64 in the manifest list entries
解决方案
方案1:使用Docker Buildx跨架构构建(无需更换现有Runner)
这是最常用的方案,通过QEMU模拟器在x86环境下直接构建arm32v7架构的镜像,修改GitLab CI的docker-build阶段配置即可:
docker-build: image: docker:stable services: - docker:dind stage: package before_script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY # 安装QEMU模拟器,支持跨架构镜像构建 - docker run --privileged --rm tonistiigi/binfmt --install all # 创建并启用buildx构建器 - docker buildx create --use --name arm_builder script: - export DOCKER_HOST=tcp://docker:2375/ # 指定目标架构为linux/arm/v7,构建完成后直接推送 - docker buildx build --platform linux/arm/v7 -t registry.gitlab.com/mygitlab/project . --push tags: - docker
Dockerfile无需额外调整,直接使用你需要的arm32v7架构Java基础镜像即可,示例:
FROM arm32v7/adoptopenjdk:16-jre COPY /build/libs/project-1.0-SNAPSHOT.jar my-jar.jar CMD java -jar my-jar.jar
方案2:使用arm32v7架构的GitLab Runner构建
如果你有闲置的树莓派或其他arm32v7架构设备,可以直接在设备上安装GitLab Runner,给Runner打上arm32v7的自定义标签,然后将docker-build阶段的tags调整为arm32v7。在arm架构环境下直接构建镜像,无需处理跨架构兼容问题,拉取arm32v7镜像不会触发报错。
额外建议
- 升级Java版本后,建议同步将Gradle构建阶段的基础镜像也升级到对应版本,避免不同版本JDK编译、运行产生兼容性问题,示例:
# 调整gradle-build阶段的镜像为对应Java版本 gradle-build: image: openjdk:16-jdk-slim stage: build script: "./gradlew build" artifacts: paths: - build/libs/*.jar
- 可以优先选用Eclipse Temurin的arm32v7镜像,它是AdoptOpenJDK捐给Eclipse后的官方后续项目,对arm32v7架构的支持更完善,且长期支持版本(如17、21)的维护周期更长,稳定性更高。
内容的提问来源于stack exchange,提问作者PurplePanda
相关产品推荐
相关产品推荐

