You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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镜像不会触发报错。

额外建议
  1. 升级Java版本后,建议同步将Gradle构建阶段的基础镜像也升级到对应版本,避免不同版本JDK编译、运行产生兼容性问题,示例:
# 调整gradle-build阶段的镜像为对应Java版本
gradle-build:
  image: openjdk:16-jdk-slim
  stage: build
  script: "./gradlew build"
  artifacts:
    paths:
      - build/libs/*.jar
  1. 可以优先选用Eclipse Temurin的arm32v7镜像,它是AdoptOpenJDK捐给Eclipse后的官方后续项目,对arm32v7架构的支持更完善,且长期支持版本(如17、21)的维护周期更长,稳定性更高。

内容的提问来源于stack exchange,提问作者PurplePanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:45:03