技术记录
Maven集成Docker镜像打包
Maven集成Docker镜像打包
传统的docker镜像打包方式需要手动输入很多命令,操作繁琐
借助 dockerfile-maven-plugin插件,可以实现在 Maven 构建过程中构建和推送 Docker 镜像
SpringBoot版本:3.0.6
Maven版本:
1.引入 dockerfile-maven-plugin 依赖
首先引入maven打包插件和docker打包插件的依赖
<build>
<plugins>
<!-- 引入maven打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<!-- 引入dockerfile-maven-plugin插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
</plugin>
</plugins>
</build>
2.配置Docker仓库信息
插件中的 <configuration> 属性用来支持用户自定义docker私服的信息
- repository:这个元素定义了 Docker 镜像的仓库和名称,即你想要推送镜像的位置。
注意事项:仓库地址前无需加http/https - tag:定义了 Docker 镜像的标签,通常用于标识镜像的版本 - username:仓库账号名,如仓库无需校验,则无需配置 - password:仓库账号密码,如仓库无需校验,则无需配置 - buildArgs:向DockerFile中传递变量
以将maven打包生成的jar包路径,当作变量传给DockerFile为例
- JAR_FILE:变量名称
JAR_FILE标签包含内容:变量值
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <configuration> <repository>example.com/docker-images/demo</repository> <tag>1.0.0</tag> <username>xxx</username> <password>xxx</password> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
3.配置插件的触发时机
在配置了Docker仓库信息后,还需要将Maven打包和Docker镜像生成结合起来,通过 <execution> 元素来实现该效果。
每个
<execution>元素定义了插件的一个执行实例。每个执行实例可以有其自己的配置和目标,并可以指定在 Maven 生命周期的哪个阶段执行。如果在
<executions>元素中定义了多个<execution>元素,那么这些执行实例将会在它们各自指定的生命周期阶段被执行。如果多个执行实例指定了相同的生命周期阶段,那么它们将会按照在 POM 文件中的顺序被执行。
以下的例子定义了一个执行实例:在 mvn package后执行docker镜像的生成和推送
<phase>: 定义在Maven的哪个生命周期执行,本例中指定的是package<goals>: 这个元素定义了在插件的执行阶段要执行的目标。在下面的例子中,build和push目标将被顺序执行。<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <configuration> <repository>example.com/docker-images/demo</repository> <tag>1.0.0</tag> <username>xxx</username> <password>xxx</password> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> <phase>package</phase> </execution> </executions> </plugin>
4.配置DockerFile
DockerFile的作用是定义如何打包镜像,该文件需要放在项目根路径下,与src目录同级
# 使用JDK 17的官方基础镜像
FROM openjdk:17-alpine
# 使用pom.xml中传递的参数
ARG JAR_FILE
# 设置工作目录
WORKDIR /app
# 将构建好的jar文件复制到镜像中
COPY $JAR_FILE app.jar
# 暴露应用运行的端口
EXPOSE 8080
# 设置环境变量,例如时区、编码等
ENV TZ=Asia/Shanghai
ENV LANG=C.UTF-8
# 设置JVM启动参数
ENV JAVA_OPTS="-XX:+UseG1GC -XX:+UseStringDeduplication"
# 启动应用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/auth.jar"]