docker multi-stage 多阶段构建
我们在构建自己的
docker镜像时,总是希望自己构建的镜像尽可能的小,那么我们可以使用
docker 的
multi-stage(多阶段)来构建镜像。
下文,我们来演示一个例子,比较一下普通构建镜像和多阶段构建镜像的镜像大小。
注意:
multi-stage需要docker 17.05或更高的版本上才可以使用。- 参考的官方文档 multi-stage
一、需求
我们使用git来下载一个maven项目,然后构建成一个镜像,比较一下普通构建和使用multi-stage构建的镜像的体积大小。
二、普通构建
1、编写Dockerfile
Dockerfile文件的名字为 Dockerfile-old
FROM maven:3.6.2-jdk-11-slim
RUN apt-get update \
&& apt-get install -y git \
&& git clone https://gitee.com/huan1993/quartz-manager.git \
&& cd quartz-manager \
&& mvn clean package
EXPOSE 9090
ENTRYPOINT ["java","-jar","/quartz-manager/target/quartz-manager-0.0.1-SNAPSHOT.jar"]
2、构建镜像
docker build -t quartz-manager-old -f Dockerfile-old .
三、多阶段(multi-stage)构建
1、编写Dockerfile
Dockerfile文件的名字为 Dockerfile-multi-stage
FROM maven:3.6.2-jdk-11-slim AS build
RUN apt-get update \
&& apt-get install -y git \
&& git clone https://gitee.com/huan1993/quartz-manager.git \
&& cd quartz-manager \
&& mvn clean package
FROM openjdk:11.0.5-jre-slim-buster
COPY --from=build /quartz-manager/target/quartz-manager-0.0.1-SNAPSHOT.jar .
EXPOSE 9090
ENTRYPOINT ["java","-jar","./quartz-manager-0.0.1-SNAPSHOT.jar"]
注意:
- 多阶段构建是写在一个
Dockerfile文件中的,可以看出里面有2个FROM等 - FROM maven:3.6.2-jdk-11-slim
AS build后方的 这个build表示为我们的构建阶段取一个名字 COPY --from=build中的--from=build表示从build这个阶段中拷贝内容。
2、构建镜像
docker build -t quartz-manager-multi-stage -f Dockerfile-multi-stage .
四、比较2个镜像的体积大小

多阶段镜像的构建可以帮助我们减小构建后的镜像的体积大小,但是需要注意的是 17.05 及以后的版本才可以使用。
docker multi-stage 多阶段构建的更多相关文章
- 使用 Docker 开发 - 使用多阶段构建镜像
多阶段构建是一个新特性,需要 Docker 17.05 或更高版本的守护进程和客户端.对于那些努力优化 Dockerfiles 并使其易于阅读和维护的人来说,多阶段构建非常有用. 在多阶段构建之前 构 ...
- Docker多阶段构建实战(multi-stage builds)
在编写Dockerfile构建docker镜像时,常遇到以下问题: RUN命令会让镜像新增layer,导致镜像变大,虽然通过&&连接多个命令能缓解此问题,但如果命令之间用到docker ...
- 多阶段构建Docker镜像
在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...
- Docker中使用多阶段Dockerfile构建容器镜像image(镜像优化)
使用多阶段构建 预计阅读时间: 6分钟 多阶段构建是守护程序和客户端上需要Docker 17.05或更高版本的新功能.多阶段构建对于那些努力优化Dockerfiles同时使其易于阅读和维护的人来说非常 ...
- 多阶段构建Golang程序Docker镜像
Docker简介 Docker是基于Linux容器技术(LXC),使用Go语言实现的开源项目,诞生于2013年,遵循Apache2.0协议.Docker自开源后,受到广泛的关注和讨论. Docker在 ...
- docker 多阶段构建
构建镜像最具挑战性的一点是使镜像大小尽可能的小.Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件.对于多阶段构建,您可以在Dockerfile中 ...
- 《Docker从入门到跑路》之多阶段构建
多阶段构建就是在一个Dokcerfile中定义多个FROM,每个FROM都可以使用不同的基础镜像,并表示开始一个新的构建阶段,我们可以很方便的将一个阶段的文件复制到另外一个阶段中,在最终的阶段保存你需 ...
- [Docker] 使用 Dockerfile 的多级构建 (multi-stage builds)
Multi-stage build 即在一个 Dockerfile 中使用多个 FROM 指令. 每个 FROM 指令可以使用不同的基础镜像,并且每一个都开启新的构建阶段. 你可以有选择地 ...
- Dockerfile多阶段构建原理和使用场景
本文转载自Dockerfile多阶段构建原理和使用场景 导语 Docker 17.05版本以后,新增了Dockerfile多阶段构建.所谓多阶段构建,实际上是允许一个Dockerfile 中出现多个 ...
随机推荐
- Element 对话框简单使用
官方文档介绍的是页内对话框,但没有基于组件的对话框,这里记录一下,原理就是父子传值是否显示 父页导入组件 <template> <div class="home" ...
- c# List集合类常用操作:二、增加
所有操作基于以下类 class Employees { public int Id { get; set; } public string Name { get; set; } public stri ...
- JS013. 重写toFixed( )方法,toFixed()原理 - 四舍五入?银行家舍入法?No!六舍七允许四舍五入√!
以下为场景实测与原理分析,需要重写函数请直接滚动至页尾!!! 语法 - Number.prototype.toFixed( ) // toFixed()方法 使用定点表示法来格式化一个数值. numO ...
- docker部署rabbitmq集群
docker版本:18.09.6 或以上 rabbitmq镜像版本:rabbitmq:3.9.5-management 一.拉镜像: docker pull rabbitmq:3.9.5-manage ...
- Linux系列(32) - rpm命令管理之RPM查询(4)
RPM包默认安装位置 RPM包默认安装路径 /etc/ 配置文件安装目录 /usr/bin/ 可执行的命令安装目录 /usr/lib/ 程序所使用的函数库保存位置 /usr/share/doc/ 基本 ...
- nginx 配置文件(支持thnkphp3.2~5)
server { listen 8080 ; server_name localhost; set $root /var/www/myweb; #listen 443 ssl; #ssl_certif ...
- sonarqube C# 单元测试覆盖率一栏总是0%解决办法
一.什么叫单元测试(unit testing)? 是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函 数,Java里 ...
- Java 爬取 51job 数据 WebMagic实现
Java 爬取 51job 数据 一.项目Maven环境配置 相关依赖 jar 包配置 <parent> <groupId>org.springframework.boot&l ...
- 初探计算机网络之TCP/IP网络协议
网络协议 在计算机诞生以来,从最原始的单机模式到现在多台计算机协同工作,形成计算机网络,从前很难想象的信息共享.多机合作.大规模计算在今天也早已成了现实.在早期,计算机网络需要解决的痛点,就是怎样 ...
- MySQL强人“锁”难《死磕MySQL系列 三》
系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 前言 最近数据库 ...