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

ops/2024/11/19 22:55:04/

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/ops/135084.html

相关文章

安全机制解析:深入SELinux与权限管理

Linux内核作为一个高自由度和优秀性能的操作系统核心,基于安全需求提供了完善的安全机制。内核安全机制不仅限于保护个人数据,还包括对运行环境和系统体系的线程化操作。本文将全方位分析Linux内核安全机制,以SELinux为主要代表,选…

Android全局异常捕获

在开发过程中我们会使用try{}catch捕获一些异常,不过我们毕竟不能面面俱到,所以总会有一些异常在我们想不到的位置发生,然后程序就崩溃了,于是赶紧连上电脑复现bug,有的可以复现有的一时还复现不了,然后就各…

hive 统计各项目下排名前5的问题种类

实现指定某项目下的数据效果图如下所示: 其中 ABCDE 为前5名的问题种类,其中A问题有124个(出现了124次) 数据说明: 整个数据集 包含很多项目一个项目 包含很多问题一个问题 选项 可认为是 类别值,所有出…

RK3568硬解码并与Qt界面融合显示深入探究

1. 最近实在头疼,因为项目换了平台。折腾来折腾去,到今天算是把很多坑踩完了。 RK上实现硬解码方案一共有一下几种方式 1)opencvgstreamer插件,采用硬解码,只能解码出图像,无法解出声音 2)ff…

Windows C++ TCP/IP 两台电脑上互相传输字符串数据

在 Windows 上使用 C 实现两个进程通过 TCP/IP 协议传输字符串数据是一个非常常见的任务。我们可以利用 Windows Sockets API (winsock2) 来进行套接字编程。在下面的例子中,我们将演示如何通过 TCP/IP 协议传输字符串数据。这里将包括两个程序:一个是服…

Spring Boot教程之Spring Boot简介

Spring Boot 简介 接下来一段时间,我会持续发布并完成Spring Boot教程 Spring 被广泛用于创建可扩展的应用程序。对于 Web 应用程序,Spring 提供了 Spring MVC,它是 Spring 的一个广泛使用的模块,用于创建可扩展的 Web 应用程序。…

笔记02----重新思考轻量化视觉Transformer中的局部感知CloFormer(即插即用)

1. 基本信息 论文标题: 《Rethinking Local Perception in Lightweight Vision Transformer》中文标题: 《重新思考轻量化视觉Transformer中的局部感知》作者单位: 清华大学发表时间: 2023论文地址: https://arxiv.org/abs/2303.17803代码地址: https://github.com/qhfan/CloF…

【设计模式】入门 23 种设计模式(代码讲解)

入门 23 种设计模式(代码讲解) 1.创建型模式2.适配器模式3.行为型模式 设计模式是在软件设计中反复出现的问题的 通用解决方案。它们是经过多次验证和应用的指导原则,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、…