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

Docker构建失败:无法解析maven:3.8.6-openjdk-21-jdk等镜像元数据

问题描述

尝试为Java Spring Boot应用构建多阶段Docker镜像,使用搭配OpenJDK 21的Maven编译代码,以OpenJDK 21作为运行环境。

原Dockerfile

# Stage 1: Build the application
FROM maven:3.8.6-openjdk-21-jdk AS build
WORKDIR /home/app
COPY . /home/app
RUN mvn -f /home/app/pom.xml clean package

# Stage 2: Run the application
FROM openjdk:21-jdk
EXPOSE 5000
COPY --from=build /home/app/target/*.jar app.jar
ENTRYPOINT [ "sh", "-c", "java -jar /app.jar" ]

执行错误

执行docker build -t my-app:v1 .时出现以下错误:

ERROR: failed to solve: failed to resolve source metadata for 
docker.io/library/maven:3.8.6-openjdk-21-jdk

以及

failed to resolve source metadata for docker.io/library/openjdk:21-jdk: not found

已尝试的操作

  • 检查Docker Hub,未找到maven:3.8.6-openjdk-21-jdk和openjdk:21-jdk镜像
  • 执行docker search maven,未找到对应版本的镜像

疑问

  1. maven:3.8.6-openjdk-21-jdk镜像是否存在?是否需要使用替代镜像?
  2. Dockerfile中应使用哪个正确的OpenJDK 21镜像?
  3. 如何正确配置Dockerfile以使用Java 21且不出现此类错误?

环境信息

  • 操作系统:Windows 11
  • Docker版本:27.3.1
  • Maven版本:3.8.1
  • Java版本:OpenJDK 21

解答

1. maven:3.8.6-openjdk-21-jdk镜像是否存在?是否需要替代?

该镜像不存在。Maven官方镜像的tag命名规则里,3.8.6版本的Maven搭配的OpenJDK最高到19,没有适配OpenJDK 21的对应tag,必须使用替代镜像。

2. 正确的OpenJDK 21镜像选择

  • 官方openjdk镜像中,OpenJDK 21的正确tag为21(而非21-jdk),也可使用带操作系统后缀的明确tag,比如21-jdk-slim、21-jdk-bookworm
  • 更推荐使用Eclipse Temurin镜像(eclipse-temurin:21-jdk),这是维护更稳定的主流OpenJDK发行版镜像

3. 修正后的Dockerfile配置

方案一:使用官方Maven+OpenJDK 21镜像(升级Maven版本)

选择支持OpenJDK 21的Maven镜像,比如maven:3.9.6-openjdk-21,运行阶段搭配官方或Temurin的OpenJDK 21镜像:

# 构建阶段:使用支持OpenJDK21的Maven镜像
FROM maven:3.9.6-openjdk-21 AS build
WORKDIR /home/app
# 先拷贝pom.xml下载依赖,利用Docker缓存优化构建速度
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests

# 运行阶段:使用官方OpenJDK21镜像
FROM openjdk:21
EXPOSE 5000
COPY --from=build /home/app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

方案二:使用Eclipse Temurin镜像(适配原有Maven 3.8.1)

如果需要保留Maven 3.8.1版本,可基于Temurin 21 JDK镜像手动安装Maven:

# 构建阶段:Temurin 21 JDK + 安装Maven 3.8.1
FROM eclipse-temurin:21-jdk AS build
WORKDIR /home/app
# 安装Maven 3.8.1
RUN apt-get update && apt-get install -y wget unzip \
    && wget https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip \
    && unzip apache-maven-3.8.1-bin.zip \
    && mv apache-maven-3.8.1 /opt/maven \
    && rm apache-maven-3.8.1-bin.zip \
    && apt-get clean
ENV PATH="/opt/maven/bin:${PATH}"

COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests

# 运行阶段:使用Temurin 21 JRE镜像(缩小镜像体积)
FROM eclipse-temurin:21-jre
EXPOSE 5000
COPY --from=build /home/app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

额外优化点

  • 构建阶段先拷贝pom.xml下载依赖,再拷贝源码,利用Docker分层缓存减少重复依赖下载
  • 运行阶段使用JRE镜像替代JDK镜像,大幅降低镜像体积
  • 执行mvn package时添加-DskipTests可跳过测试,加快构建速度(按需使用)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:06:01