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 中出现多个 ...
随机推荐
- 通过cglab 实现 Spring AOP
1新建一个目标类 public class StudentService { public void delete(){ System.out.println("删除学生"); } ...
- Identity用户管理入门二(显示用户列表)
在Controllers中新建AccountController,并在构造方法(函数)中注入SignInManager,UserManager UserManager 用户管理(注册,查找,修改, ...
- MySQL数据库初体验
一.数据库的基本概念1.数据(Data) 描述事物的符号记录 包括数字,文字,图形,图像,声音,档案记录等 以"记录"形式按统一的格式进行存储 2.表 将不同的记录组织在一起 用来 ...
- 1.docker概述及其历史
一. 为什么会出现docker? 不用说, 肯定是时代进步的产物. 那么, 他为什么能火? 一定是解决了痛点问题. docker也不是一下子就火起来了, 他的火也是有一个过程的, 我们先来看看为什么会 ...
- HTML+CSS设计个人主页
在个人主页的设计中,我采用了圣代布局和div分块.效果图如下: <!DOCTYPE html> <html lang="en"> <head> ...
- 使用manacher算法解决最长回文子串问题
要解决的问题 求一个字符串最长回文子串是什么.且时间复杂度 O(N) 具体描述可参考: LeetCode_5_最长回文子串 LintCode_200_最长回文子串 暴力解法 以每个字符为中心向左右两边 ...
- Lambda 表达式详解
目录 前言 预备知识,理解委托的构成 引用实例方法的委托 引用静态方法的委托 Lambda 表达式的实际编译结果 CASE 1 没有捕获任何外部变量的Lambda 表达式 CASE 2 捕获了外部方法 ...
- 解决IE浏览器 点击子元素重复调用执行 mouseover 与mouseout兼容性问题
将函数配对换为下面2个就可以解决兼容性问题. mouseenter() mouseleave(0
- Shell系列(4)- 历史命令
格式:history [选项] [历史命令保存文件] 选项: -c:清空历史命令 -w:把缓存中的历史命令写入到历史命令保存文件~ /.bash_history;用户的家目录下 例子: [root@l ...
- Kotlin协程入门
开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 介绍Kotlin中的协程.用一 ...