跳转至

构建JavaMaven项目镜像

多阶段构建优势

针对 Java 这类的编译型语言,使用 Dockerfile 多阶段构建,具有以下优势:

  • 保证构建镜像的安全性:当使用 Dockerfile 多阶段构建镜像时,需要在第一阶段选择合适的编译时基础镜像,进行代码拷贝、项目依赖下载、编译、测试、打包流程。在第二阶段选择合适的运行时基础镜像,拷贝基础阶段生成的运行时依赖文件。最终构建的镜像将不包含任何源代码信息。

  • 优化镜像的层数和体积:构建的镜像仅包含基础镜像和编译制品,镜像层数少,镜像文件体积小。

  • 提升构建速度:使用构建工具(Docker、Buildkit 等),可以并发执行多个构建流程,缩短构建耗时。

官方:

Maven 项目示例

Maven 是目前最流行的 Java 项目管理工具之一,提供了强大的包依赖管理和应用构建功能。

使用 Maven 先创建一个 SpringBoot 的项目

mvn archetype:generate \
  -DarchetypeCatalog=internal \
  -DinteractiveMode=false \
  -DremoteRepositories=http://maven.aliyun.com/nexus/content/groups/public \
  -DarchetypeArtifactId=maven-archetype-webapp \
  -DgroupId=com.liaosirui.demo \
  -DartifactId=maven-demo \
  -Dpackage=com.liaosirui.demo \
  -Dversion=1.0-SNAPSHOT

给项目添加一个声明使用内部仓库或者其他 Maven 代理仓库

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">

    <pluginGroups></pluginGroups>

    <proxies></proxies>

    <servers></servers>

    <mirrors>
        <mirror>
            <id>aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </mirror>
    </mirrors>

    <profiles></profiles>

</settings>

更加下 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    ...
    <packaging>jar</packaging>
    ...
    <!-- <build>
        <finalName>maven-demo</finalName>
    </build> -->
</project>

以 Java Maven 项目为例,在 Java Maven 项目中新建 Dockerfile 文件,并在 Dockerfile 文件添加以下内容。

# First stage: complete build environment
FROM maven:3.8.6-openjdk-8 AS builder

COPY settings.xml /usr/share/maven/conf/settings.xml

WORKDIR /app

# add pom.xml and source code
COPY ./pom.xml pom.xml
COPY ./src src/

# package jar
RUN mvn clean package

# Second stage: minimal runtime environment
FROM openjdk:8-jre

# copy jar from the first stage
COPY --from=builder /app/target/*.jar /release

WORKDIR /release

EXPOSE 8080

CMD ["java", "-jar", "maven-demo-1.0-SNAPSHOT.jar"]