记录将springboot的jar包和lib分离,使用docker-compose部署

本文讲诉如何把jar里的lib依赖包独立出来,方便更新服务时,缩小jar的体积,下面以若依的system服务为例,配置中的路径请酌情修改,主要提供大致配置逻辑
 

第一步:修改项目的pom.xml,调整build的配置

<build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!--这是默认的打包方式-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--                <version>${spring-boot.version}</version>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        <goals>-->
<!--                            <goal>repackage</goal>-->
<!--                        </goals>-->
<!--                    </execution>-->
<!--                </executions>-->
<!--            </plugin>-->

            <!-- 以下是分离lib的打包方式 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <executable>true</executable>
                    <layout>ZIP</layout>
                    <!--解决windows命令行窗口中文乱码-->
                    <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
                    <!--这里是填写需要包含进去的jar,必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来如果没有则nothing ,表示不打包依赖 -->
                    <includes>
                        <include>
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                </configuration>
            </plugin>

            <!--拷贝依赖到jar外面的lib目录-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!--指定的依赖路径-->
                            <outputDirectory>
                                ${project.build.directory}/lib
                            </outputDirectory>
                            <excludeScope>provided</excludeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <!--指定启动类-->
                         <mainClass>org.dromara.system.RuoYiSystemApplication</mainClass>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

打包后会得到分离的jar和lib


打开jar里的MANIFEST.MF,可看到指定了依赖包的路径

第二步:构建dockerfile,不同的就是复制lib目录到镜像中

# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-debian:17.0.11-cds
#FROM bellsoft/liberica-openjdk-debian:21.0.3-cds
#FROM findepi/graalvm:java17-native

LABEL maintainer="Gavino"

RUN mkdir -p /gavino/system/logs \
    /gavino/system/temp \
    /gavino/skywalking/agent

WORKDIR /gavino/system

ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""

EXPOSE ${SERVER_PORT}


#复制依赖 jar
COPY ${OUT_DIRECTORY}/lib ./lib


ADD ruoyi-system.jar ./app.jar

ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
           #-Dskywalking.agent.service_name=ruoyi-system \
           #-javaagent:/gavino/skywalking/agent/skywalking-agent.jar \
           -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \
           -jar app.jar

项目运行时,会根据MANIFEST.MF中配置的路径加载依赖包,所以只需要复制lib到相应目录

第三步:编写docker-compose,注意dockerfile的路径以及网络配置,以下是我的配置,酌情修改

version: '3'

services:
  ruoyi-system:
    container_name:ruoyi-system
    build:
      context: /cloud-pck/ruoyi-cloud/system
      dockerfile: Dockerfile
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    volumes:
      # 配置文件
      - /docker/ruoyi-system/logs/:/gavino/system/logs
      # skywalking 探针
      - /docker/skywalking/agent/:/gavino/skywalking/agent
    privileged: true
    networks:
      - ruoyi-cloud-net


networks:
  ruoyi-cloud-net:
    external: true

<think>好的,用户现在的问题是在Linux上使用docker-compose部署一个JAR的Java服务,并配置相关服务。我需要根据之前的对话用户提供的引用内容来构建回答。 首先回顾之前的对话,用户之前询问的是部署Nginxindex.html,现在转向部署JAR,可能涉及到Spring Boot应用。用户可能需要一个完整的docker-compose配置示例,以及相关的步骤说明。 查看用户提供的引用内容,引用1提到了docker-compose安装部署JAR的配置文件,括镜像构建、端口映射、环境变量等。引用2引用3也提到了部署Spring Boot JAR的命令步骤,引用4涉及卸载旧版Docker配置yum源。这些引用提供了安装docker-compose的方法、配置文件的结构、以及如何运行服务的信息。 用户的需求是部署JAR,可能希望了解如何编写docker-compose.yml,如何构建Docker镜像,以及如何配置相关服务比如Nginx反向代理或者数据库。需要确保回答覆盖这些方面,并且结构清晰,步骤详细。 需要注意用户可能不熟悉Dockerdocker-compose,所以需要解释关键配置,比如volumes、ports、build上下文等。同时,根据之前的回答,用户可能希望有目录结构说明、部署流程常见问题解决方法。 还要考虑是否需要Dockerfile,因为构建Java应用通常需要它。引用1中的示例使用了build指令,所以需要说明如何创建Dockerfile,并构建镜像。 另外,用户可能希望服务能够持久化运行,所以配置restart策略很重要。引用中提到了restart: always,这也应该含在回答中。 可能还需要提到网络配置,比如使用自定义网络或者host模式,但根据引用中的例子,使用默认的bridge网络可能更简单。 最后,生成相关问题,帮助用户进一步了解优化方法、多服务编排、日志管理等内容。</think>以下是基于Linux系统使用docker-compose部署JAR服务的完整解决方案,含关键配置说明最佳实践: --- ### 一、基础部署配置(docker-compose.yml) ```yaml version: '3.8' services: java-app: build: context: . # Dockerfile所在目录 dockerfile: Dockerfile image: java-app:latest container_name: my_java_service ports: - "8080:8080" # 主机端口:容器端口 environment: - TZ=Asia/Shanghai # 时区配置 - SPRING_PROFILES_ACTIVE=prod volumes: - ./logs:/app/logs # 日志持久化 networks: - app_network restart: unless-stopped # 异常退出自动重启 networks: app_network: driver: bridge ``` --- ### 二、配套Dockerfile示例 ```dockerfile # 基础镜像选择(推荐使用官方镜像) FROM eclipse-temurin:17-jdk-jammy # 设置工作目录 WORKDIR /app # 复制JAR配置文件 COPY target/*.jar app.jar COPY config/application.yml ./config/ # 暴露端口(需与docker-compose端口映射对应) EXPOSE 8080 # 启动命令(推荐使用非root用户) RUN useradd -m appuser && chown -R appuser /app USER appuser ENTRYPOINT ["java", "-jar", "app.jar"] ``` --- ### 三、目录结构规范 ```bash ├── docker-compose.yml ├── Dockerfile ├── target/ │ └── your-app.jar # 需部署JAR ├── config/ │ └── application.yml # 应用配置文件 └── logs/ # 日志目录(自动生成) ``` --- ### 四、关键配置解析 1. **镜像构建优化**: ```dockerfile # 多阶段构建示例(减小镜像体积) FROM eclipse-temurin:17-jdk-jammy as builder WORKDIR /app COPY . . RUN ./gradlew build FROM eclipse-temurin:17-jre-jammy COPY --from=builder /app/build/libs/*.jar app.jar ``` 2. **资源限制配置**: ```yaml # 在docker-compose中添加资源限制 deploy: resources: limits: cpus: '2' memory: 2G ``` 3. **健康检查机制**: ```yaml healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] interval: 30s timeout: 5s retries: 3 ``` --- ### 五、部署操作流程 1. **准备环境**: ```bash # 安装docker-compose(若未安装) sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ``` 2. **构建镜像**: ```bash # 在项目根目录执行 docker-compose build --no-cache ``` 3. **启动服务**: ```bash # 后台启动(推荐生产环境使用docker-compose up -d # 查看实时日志 docker-compose logs -f ``` 4. **服务管理**: ```bash # 停止服务 docker-compose down # 更新服务(修改配置后) docker-compose up -d --force-recreate ``` --- ### 六、进阶配置方案 1. **多服务编排示例**(含MySQLNginx): ```yaml services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: appdb volumes: - mysql_data:/var/lib/mysql nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - java-app volumes: mysql_data: ``` 2. **环境变量管理**: ```yaml env_file: - .env # 独立管理敏感配置 ``` --- ### 七、常见问题解决 1. **端口冲突**: ```bash # 查看端口占用 sudo lsof -i :8080 # 修改docker-compose端口映射 ports: - "8090:8080" ``` 2. **时区不一致**: ```dockerfile # 在Dockerfile中添加 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ``` 3. **内存溢出处理**: ```yaml environment: - JAVA_OPTS=-Xmx512m -Xms256m ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Gavino.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值