共计 918 个字符,预计需要花费 3 分钟才能阅读完成。
一、什么是多阶段构建?
我们知道 docker 镜像是分层的,每多一层都会让构建出来的镜像变大。而且构建环境有很多运行时不必要的东西,也就意味着很有可能构建出来 1-2g 的镜像运行其实只需要 100m,那有没有办法能够解决这种尴尬的情况呢?
Docker 17.05 版本以后允许 Dockerfile 支持多个 FROM 指令了,这也就意味着我们可以将构建环境与运行环境分开。多个 FROM 命令,即多阶段构建。
比如制作一个 srpingboot 项目的 docker 镜像,可以先拉取一个带有 maven 命令的镜像,下载源码后进行打包操作,打好 jar 包以后,只需要有 java 环境的镜像就可以运行。
二、多阶段构建 springboot 项目
例如现在有一个 springboot 项目,目录结构如下:
熟悉 springboot 项目的话应该很清楚,比起一般的项目就多一个 dockerfile 文件,内容如下:
FROM maven:3-jdk-8 AS builder
WORKDIR /workspace
COPY . /workspace
RUN mvn clean install -Dmaven.test.skip=true
FROM openjdk:8-jre-alpine
WORKDIR /workspace
COPY --from=builder /app/target/*.jar /workspace/app.jar
ENTRYPOINT ["java","-jar","-Xms64m","-Xmx128m","h5.jar"]
重要的是 COPY --from=builder /app/target/*.jar /workspace/app.jar
代表从某个阶段拷贝文件。当然你也可以用COPY --from=0 /app/target/*.jar /workspace/app.jar
,COPY --from=0是指从第一个阶段的构建结果中拷贝文件,如果有更多阶段依此类推。
使用上面的 dockerfile 就可以有效减小镜像的大小,并且在服务器本地没有任何打包或者运行环境的时候只需要源码就可以构建镜像。
在开发调试过程中,也可以保留某个阶段的现场,执行构建阶段:
docker build --target builder -t test .
提醒:本文发布于825天前,文中所关联的信息可能已发生改变,请知悉!