构建一个包含mvn命令的Java 17基础镜像

本文介绍了如何在官方提供的OpenJDK基础镜像中安装Maven,包括下载基础镜像、在容器内安装、构建新镜像并进行测试验证的详细步骤。作者鼓励读者提供反馈以便改进。

前言

官方提供的openjdk基础镜像,不包含mvn命令,无法用容器来打包代码。

在官方提供的镜像基础上安装maven。

前期准备,需要安装好docker。

一、安装maven

1、下载openjdk基础镜像,执行如下代码。

docker pull openjdk:17-jdk-alpine

2、使用基础镜像运行一个容器,执行如下命令。

docker run -it openjdk:17-jdk-alpine sh

3、修改镜像源地址,执行如下命令。

cat /etc/apk/repositories
https://mirrors.aliyun.com/alpine/v3.14/main
https://mirrors.aliyun.com/alpine/v3.14/community

4、下载安装maven,执行如下命令。

apk update && \
wget -O /tmp/apache-maven.tar.gz https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz && \
mkdir -p /usr/share/maven && \
tar -zxvf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 && \
rm -f /tmp/apache-maven.tar.gz && \
ln -s /usr/share/maven/bin/mvn /usr/bin/mvn

5、检查maven是否安装完成,执行如下命令。

mvn --version

正常情况会返回如下内容。

6、构建新镜像,执行如下命令。

docker commit -m "含maven的jdk镜像" 7da01751c5bb ayzen/openjdk:17-jdk-alpine

7da01751c5bb:为上面运行的容器id。

7、至此,在openjdk镜像基础上安装maven的新镜像已完成。

二、测试验证

1、使用新镜像运行容器,执行如下命令。

docker run -it ayzen/openjdk:17-jdk-alpine sh

2、找一个Java项目测试打包,执行如下命令。

mvn clean package -DskipTests

等待一会正常情况会输出如下内容,说明已打包完成。

3、运行Java项目,执行如下命令。

java -jar target/springboot-hello-1.0-SNAPSHOT.jar

正常情况会输出如下内容,说明服务已正常运行。

4、至此、maven的测试已验证完成。

总结

因为官方提供的openjdk基础镜像不包含maven,所以需要自己动手加,步骤也比较简单。

1、下载官方的基础镜像。

2、运行镜像,在容器内安装maven,构建新镜像。

3、测试验证新镜像。

最后因本人能力有限,有什么不对的地方望各位大佬指出好让我改进,多多包含,谢谢大家。

<think> 我们正在讨论如何为Java应用创建Docker镜像,特别是多阶段构建方法。根据引用内容,多阶段构建是推荐的方式,因为它可以显著减小镜像体积。 引用[1]提到多阶段构建是理想方式,并分析了优缺点;引用[2]详细说明了多阶段构建如何帮助镜像瘦身;引用[3]解释了传统构建方式的问题(如留下大量依赖)。 根据这些引用,我们可以给出多阶段构建Java镜像的方法。 步骤: 1. 第一阶段:使用Maven基础镜像构建应用,生成可部署的包(如JAR或WAR)。 2. 第二阶段:使用轻量级的运行时基础镜像(如JRE),并将第一阶段生成的包复制进来。 这样,最终的镜像包含运行所需的文件,不包含构建工具和中间依赖,从而减小体积。 下面是一个典型的Dockerfile示例(以Spring Boot应用为例): </think> ### 多阶段构建 Java Docker 镜像的方法 多阶段构建Docker 推荐的 Java 镜像构建方式,它能显著减小镜像体积(通常可减少 50%-80%)并提升安全性。以下是详细步骤和示例: #### 📌 核心步骤 ```dockerfile # 第一阶段:构建环境(包含完整 JDKMaven) FROM maven:3.8.6-openjdk-17 AS builder WORKDIR /app COPY pom.xml . # 先下载依赖(利用 Docker 层缓存) RUN mvn dependency:go-offline COPY src ./src # 构建可执行 JAR RUN mvn clean package -DskipTests # 第二阶段:运行环境(仅保留 JRE) FROM eclipse-temurin:17-jre-alpine WORKDIR /app # 从构建阶段复制 JAR 文件 COPY --from=builder /app/target/*.jar app.jar # 暴露端口并设置启动命令 EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] ``` #### ✅ 关键优势 1. **镜像瘦身** - 第一阶段:约 700MB+(含 JDK/Maven) - 第二阶段:仅 150MB 左右(仅 JRE + JAR)[^2][^3] - 对比单阶段构建:体积缩小 4-5 倍 2. **安全性提升** - 最终镜像**不包含**构建工具、源代码、中间依赖 - 减少攻击面(如 Maven 漏洞不影响运行时)[^3] 3. **性能优化** - 轻量镜像加速容器启动速度 - Alpine 基础镜像减少内存占用[^2] #### ️ 注意事项 1. **依赖管理** ```dockerfile # 优先单独复制 pom.xml 并下载依赖 COPY pom.xml . RUN mvn dependency:go-offline # 利用 Docker 缓存加速构建 ``` 2. **JRE 选择** - 推荐 `eclipse-temurin:XX-jre-alpine` 或 `amazoncorretto:XX-alpine` - 避免使用 `openjdk:XX`(包含不必要的 JDK 工具) 3. **多模块项目** 需调整 JAR 复制路径: ```dockerfile COPY --from=builder /app/module/target/*.jar app.jar ``` #### 🔍 验证镜像 ```bash # 构建镜像 docker build -t java-app:multistage . # 查看镜像大小 docker images | grep java-app # 运行测试 docker run -p 8080:8080 java-app:multistage ``` #### 💡 进阶优化 1. **使用 JLink 定制 JRE** ```dockerfile FROM builder AS jlink-builder RUN jlink --add-modules java.base,java.logging \ --strip-debug --no-header-files --no-man-pages \ --output /jre-minimal ``` 2. **多架构支持** 在 `docker build` 时添加 `--platform linux/amd64,linux/arm64` > 多阶段构建通过分离构建与运行环境,解决了传统 Java 镜像臃肿的问题。镜像体积的减小不仅节省存储资源,还提升了安全性和部署效率,特别适合持续集成/持续部署(CI/CD)场景[^1][^2][^3]。 --- ### 📚 相关问题 1. 如何在多阶段构建中优化 Maven 依赖下载速度? 2. 多阶段构建与传统 Docker 构建的性能差异如何量化? 3. 除了 Java,哪些语言的项目适合使用多阶段构建? 4. 如何在 Kubernetes 环境中验证多阶段构建镜像的稳定性?
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayzen1988

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值