开发测试期间docker构建springboot项目例子

本文介绍了解决大容量JAR包频繁上传部署的问题,通过解包JAR文件并分离lib依赖,结合Docker镜像构建,显著提高了测试服务器上的部署速度。提供了两种实现方式,一是通过Maven插件解包,二是配置依赖外部lib。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发测试期间,需要多次打包上传测试服务器,打出来的jar包100M左右,要是构建成docker镜像至少200M往上。
为了加快上传部署测试包的速度,想到了直接运行jar不用docker(但是为了保证与线上环境一致,必须用docker)。然后决定 jar文件解包 分离lib依赖(lib文件不变动的话只需要传一次)。测试服务器上构建docker镜像。

方式一

pom文件,配置build解包插件

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!--spring-boot Maven 插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
            </plugin>
            <!--Maven创建Docker镜像 之前解包JAR-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack</id>
                        <phase>package</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>${project.groupId}</groupId>
                                    <artifactId>${project.artifactId}</artifactId>
                                    <version>${project.version}</version>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
    </build>

然后,把解包后的文件和Dockerfile上传服务器

#FROM openjdk:8-jdk-alpine
FROM  openjdk:8-jre
VOLUME /tmp
ARG DEPENDENCY=dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
EXPOSE 9081
ENTRYPOINT ["java","-cp","app:app/lib/*","com.xxx.Application"]

# 本地执行 clean package
# maven打包时, 解压出来的文件(需要传到服务器上的那一部分)目录结构
#├─ Dockerfile   ##上传服务器
#├─ target
#└── dependency  ##上传服务器(包括所有子目录及文件)
#    ├── BOOT-INF
#    │   ├── classes
#    │   │   └── 略
#    │   └── lib
#    │       └── 略
#    ├── META-INF
#    │   └── 略
#    └── org
#        └── 略

# linux服务器上使用docker部署项目
#1. 在linux服务器上创建文件夹, 例如: freeman
#2. 将maven打包后解压出来(target目录下)的 dependency 目录和Dockerfile文件 传到服务器的freeman文件夹(以后修改代码,只需要替换部分内容,然后重新构建镜像)
#3. docker build镜像
#   进入freeman文件夹
#   docker build -t freeman:test .
#   注意语句结束后的“.”,不可省略
#4. 创建容器,并启动(如果存在,先删除), 预览效果
#   docker run -it --rm -p 9081:9081 --name app -v /etc/localtime:/etc/localtime freeman:test
#5. 创建容器,在后台启动(预览能正常启动后)
#   docker run -d -p 9081:9081 --name app -v /etc/localtime:/etc/localtime freeman:test
#
#到此部署成功。

方式二

pom文件,build配置依赖外部lib

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--<classifier>exec</classifier>-->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.fyts.api.ApiApplication</mainClass> <!--指定Springboot程序启动类-->
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix> <!--指定依赖的jar包相对于本程序jar的位置-->
                        </manifest>
                        <manifestEntries>
                            <Class-Path>./</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

然后,手动把打好的jar中BOOT-INF目录下的lib文件解压出来,与jar包、还有Dockerfile上传到服务器的同一目录下

FROM frolvlad/alpine-oraclejre8
VOLUME /tmp
COPY xxxyyyzzz.jar app.jar
COPY lib lib
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=test -jar app.jar" ]

之后,在服务器上构建docker镜像…

查看实时日志

docker logs [选项][选项]... 容器名称
选项

  • -f : 查看实时日志
  • -t : 查看日志产生的日期
  • –since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
  • -tail=10 : 查看最后的10条日志。

用法示例

docker logs -f -t --since="2020-02-02" --tail=200 容器名称
docker logs -f --tail=100 demo-api

别人项目的Dockerfile:

FROM anapsix/alpine-java:8_server-jre_unlimited

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN mkdir -p /opt/projects/mall4j

WORKDIR /opt/projects/mall4j

EXPOSE 8086

ADD ./yami-shop-api/target/yami-shop-api-0.0.1-SNAPSHOT.jar ./

CMD java -jar -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -Dspring.profiles.active=docker yami-shop-api-0.0.1-SNAPSHOT.jar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值