如何将java项目打包成docker 镜像并且可运行

devtools/2024/11/16 16:14:02/

java 项目打包成 Docker 可运行的镜像,其目的是便于运用docker容器来管理项目。下面是具体的步骤,如果大家遇到啥问题可以留言有空会逐一回复。

 

目录

1. 确保项目已经打包成 JAR 文件

2. 编写 Dockerfile

3. 构建 Docker 镜像

4. 运行 Docker 容器

5. 验证


1. 确保项目已经打包成 JAR 文件

首先,确保已经使用 Maven 或 Gradle 等工具将项目打包成 JAR 文件。如果使用的是 Maven,可以通过以下命令打包:

mvn clean package

这会在 target/ 目录下生成一个可执行的 JAR 文件。

2. 编写 Dockerfile

在项目的根目录下创建一个 Dockerfile,内容大致如下:

# 使用 OpenJDK 8 基础镜像
FROM openjdk:8-jdk-alpine# 设置工作目录
WORKDIR /app# 将所需文件和文件夹复制到容器的 /app 目录
COPY target/lib /app/lib
COPY target/resources /app/resources
COPY target/monitor-api.jar /app/monitor-api.jar
COPY target/license.json /app/license.json
COPY target/license.md5 /app/license.md5# 设置 Spring Profile 激活 dev 配置
ENV SPRING_PROFILES_ACTIVE=dev# 暴露端口 20001 和 2000
EXPOSE 20001 2000# 启动 JAR 文件
ENTRYPOINT ["java", "-jar", "/app/monitor-api.jar", "--spring.config.name=application-dev"]

FROM openjdk:17-jdk-slim:选择一个合适的 OpenJDK 镜像作为基础镜像。比如openjdk:8-jdk-alpine只是需要确保你的docker里已经有这个image.。如果没有可直接拉去镜像:

docker pull openjdk:8-jdk-alpine

COPY target/your-project-name.jar /app/your-project-name.jar:将打包好的 JAR 文件复制到 Docker 容器中。

ENTRYPOINT ["java", "-jar", "/app/your-project-name.jar"]:设置容器启动时运行的命令,这里是启动 JAR 文件。

EXPOSE 8080:暴露应用的端口,确保容器外部可以访问应用。

3. 构建 Docker 镜像

在项目根目录下,打开终端并运行以下命令构建 Docker 镜像:

docker build -t your-image-name .

 

这将基于 Dockerfile 文件构建镜像,并将其命名为 your-image-name

4. 运行 Docker 容器

构建完成后,可以运行你的 Java 应用容器:

docker run -d -p 8080:8080 your-image-name

5. 验证

现在,你应该可以通过访问 http://localhost:8080 来访问你的 Java 应用。

下面是拓展内容,可各自选择是否使用Multi-stage Build 来优化镜像。比如说有镜像大小限制的可以参考一下进行操作:

# 第一阶段:构建阶段
FROM maven:3.8.6-openjdk-17-slim AS buildWORKDIR /appCOPY pom.xml .
COPY src ./srcRUN mvn clean package -DskipTests# 第二阶段:运行阶段
FROM openjdk:8-jdk-alpineWORKDIR /appCOPY --from=build /app/target/your-project-name.jar .ENTRYPOINT ["java", "-jar", "your-project-name.jar"]
EXPOSE 8080

Maven 和其他构建工具只存在于构建阶段,最终镜像只包含运行 JAR 所需的内容。这样镜像将更加轻量。


http://www.ppmy.cn/devtools/134469.html

相关文章

【计网不挂科】计算机网络第四章< 网络层 >习题库(含答案)

前言 大家好吖,欢迎来到 YY 滴计算机网络 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的计算机网络题目,供yy应对期中考试复习。大家可以参考 本章为分章节的习题内容题库&#x…

【大数据学习 | HBASE高级】hbase的参数优化

Zookeeper 会话超时时间 属性:zookeeper.session.timeout 解释:默认值为 90000 毫秒(90s) hbase.client.pause(默认值 100ms)重试间隔 hbase.client.retries.number(默认 15 次)重试…

【JavaScript】JavaScript开篇基础(6)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

VRRP HSRP GLBP 三者区别

1. VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 标准协议:VRRP 是一种开放标准协议(RFC 5798),因此支持的厂商较多,通常用于多种网络设备中。主备模式:…

常见查找排序算法

算法 作用: 提高代码运行效率 评判算法是否优良 时间复杂度 预测代码执行所需的时间与关键系数的关系 代码执行时间越短越好 空间复杂度 代码执行所需占用的空间,越小越好 常用算法 两数交换 方式1: int a10; int b1; int c a; a b; b c; 方式2: int a10; int b1; aab; b…

操作系统实验:在linux下用c语言模拟进程调度算法程序

文章目录 1、实验内容2、实验结果及分析3、如何在linux下编写并执行c语言程序以及实验源代码gcc -o test test.c1、实验内容 1)用C语言编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中,我们通常会将某些常见组件进行二次封装,以便更好地实现特定的业务需求。然而,在封装 Table 组件时,遇到一个问题:Table 内部暴露的方法,在封装之后的组件获取不到。 代码展示为: …

坚果云·无法连接服务器(无法同步)

cmd,右键选择:以管理员身份打开输出netsh winsock reset,重启计算机即可 (这是由于某些代理防火墙导致的;关闭代理,使用代理设置清理器) 如果还不行, 换用移动热点、关闭有线网络&a…