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,未找到对应版本的镜像
疑问
maven:3.8.6-openjdk-21-jdk镜像是否存在?是否需要使用替代镜像?- Dockerfile中应使用哪个正确的OpenJDK 21镜像?
- 如何正确配置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
相关产品推荐
相关产品推荐

