在Docker中,多级构建(Multi-stage build)是一种非常有用的技术,它允许你在一个Dockerfile中使用多个FROM指令。每个FROM指令可以使用不同的基础镜像,并开始一个新的构建阶段。这样,你可以将一个阶段中构建的产物复制到另一个阶段中,同时丢弃不需要的中间产物,从而减小最终镜像的大小。
多级构建的主要优势:
-
减小镜像大小:因为最终镜像只包含你需要的文件和依赖,而不包含构建过程中产生的中间文件或工具。
-
提高安全性:减少最终镜像中的软件数量,从而减少攻击面。
-
优化构建过程:可以在不同的阶段使用不同的基础镜像,例如在构建阶段使用包含编译器等工具的镜像,而在运行阶段使用轻量级的基础镜像。
基本结构:
一个多级构建的Dockerfile通常包含多个阶段。每个阶段都有一个可选的名称(使用AS关键字),以便后续阶段引用。最后一个阶段(通常不命名)将作为最终生成的镜像。
ini
[root@docker-server ~]# mkdir java-dockerfile
[root@docker-server ~]# cd java-dockerfile/
[root@docker-server java-dockerfile]# vim Dockerfile
# 阶段1: 编译应用
FROM maven:3.6.3-jdk-11 AS java
WORKDIR /app
COPY src /app/src
COPY pom.xml /app
RUN mvn clean package
# 阶段2: 创建最小化运行时镜像
FROM tomcat:9
COPY --from=java /app/target/easy-springmvc-maven.war /usr/local/tomcat/webapps/easy-springmvc-maven.war
EXPOSE 8080
CMD ["catalina.sh","run"]
[root@docker-server java-dockerfile]# docker build -t test/java:v1.0 .
[root@docker-server java-dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/java v1.0 9cc1b45368ac 57 seconds ago 228MB
[root@docker-server java-dockerfile]# docker run -itd --name java -p 8080:8080 test/java:v1.0
复制编译后的应用 :使用COPY --from=java
指令从第一个阶段复制编译后的.war/jar
文件到这个镜像中。注意这里的--from=java
指定了源阶段。