Docker多阶段构建是一种技术,允许在不同的构建阶段中使用不同的基础镜像,并只复制构建所需的文件和依赖项。这种技术旨在减少最终生成的Docker镜像的大小和运行时的资源消耗。

多阶段构建的一般工作流程如下:

  1. 使用一个包含完整开发环境的基础镜像开始构建。
  2. 在第一个构建阶段,将源代码、编译器和构建工具复制到镜像中,并进行编译、打包等构建操作。
  3. 在第二个构建阶段(或更多阶段),使用另一个轻量级的基础镜像,如Alpine Linux等,将第一阶段构建生成的结果复制过来。通常只包含运行时所需的文件和依赖项,而不包括开发工具和编译器等。

多阶段构建的优势包括:

  1. 减少镜像大小:由于第二阶段只包含运行时所需的文件和依赖项,因此生成的镜像比包含完整开发环境的单阶段构建要小得多。这有助于减少存储空间和传输时间,并提高镜像的下载速度。
  2. 减少运行时资源消耗:运行时只需要加载第二阶段的镜像,不需要加载整个开发环境和构建工具。这有助于减少内存占用和启动时间,并提高容器的性能。
  3. 提高安全性:通过在第二阶段排除不必要的文件和依赖项,可以减少潜在的安全漏洞和攻击面。

需要注意的是,多阶段构建适用于构建过程可以分为明确的开发和运行阶段的应用程序。对于某些场景,如具有复杂构建过程或依赖项的应用程序,可能需要更复杂的构建策略来进一步减小镜像大小和资源消耗。

在Docker多阶段构建中,Dockerfile 是定义构建过程的文件。它包含了一系列指令,这些指令告诉Docker如何构建你的应用程序镜像。下面是一个使用多阶段构建的简单 Dockerfile 示例:

# 第一阶段:构建阶段
FROM golang:1.16-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp . # 第二阶段:运行阶段
FROM alpine:latest
WORKDIR /root/
# 只从构建阶段复制构建好的应用程序
COPY --from=Builder /app/myapp .
CMD ["./myapp"]

在这个例子中,我们定义了两个构建阶段:

  1. 第一阶段(标记为 Builder)使用 golang:1.16-alpine 作为基础镜像,这个镜像包含了Go编程语言的编译器和工具链。我们将工作目录设置为 /app,并将当前目录(.)下的所有文件复制到容器中。然后,我们运行 go build 命令来编译Go应用程序。
  2. 第二阶段使用 alpine:latest 作为基础镜像,这是一个轻量级的Linux发行版。我们将工作目录设置为 /root/,然后使用 COPY --from=Builder 指令从第一阶段(Builder阶段)复制构建好的应用程序(myapp)到当前阶段。最后,我们设置容器启动时要运行的命令(CMD ["./myapp"])。

使用多阶段构建,最终生成的Docker镜像将只包含运行应用程序所需的最少文件和依赖项,因为第二阶段只复制了编译好的应用程序,而没有包含任何编译器或源代码。这有助于减小镜像的大小并提高安全性。

什么是docker的多阶段构建的更多相关文章

  1. docker multi-stage 多阶段构建

    多阶段构建 一.需求 二.普通构建 1.编写Dockerfile 2.构建镜像 三.多阶段(multi-stage)构建 1.编写Dockerfile 2.构建镜像 四.比较2个镜像的体积大小 我们在 ...

  2. Docker学习——多阶段构建(六)

    之前的做法 在 Docker 17.05 版本之前,我们构建 Docker 镜像时,通常会采用两种方式: 全部放入一个 Dockerfile 一种方式是将所有的构建过程编包含在一个 Dockerfil ...

  3. 多阶段构建Docker镜像

    在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...

  4. Docker多阶段构建实战(multi-stage builds)

    在编写Dockerfile构建docker镜像时,常遇到以下问题: RUN命令会让镜像新增layer,导致镜像变大,虽然通过&&连接多个命令能缓解此问题,但如果命令之间用到docker ...

  5. 多阶段构建Golang程序Docker镜像

    Docker简介 Docker是基于Linux容器技术(LXC),使用Go语言实现的开源项目,诞生于2013年,遵循Apache2.0协议.Docker自开源后,受到广泛的关注和讨论. Docker在 ...

  6. 使用 Docker 开发 - 使用多阶段构建镜像

    多阶段构建是一个新特性,需要 Docker 17.05 或更高版本的守护进程和客户端.对于那些努力优化 Dockerfiles 并使其易于阅读和维护的人来说,多阶段构建非常有用. 在多阶段构建之前 构 ...

  7. docker 多阶段构建

    构建镜像最具挑战性的一点是使镜像大小尽可能的小.Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件.对于多阶段构建,您可以在Dockerfile中 ...

  8. 《Docker从入门到跑路》之多阶段构建

    多阶段构建就是在一个Dokcerfile中定义多个FROM,每个FROM都可以使用不同的基础镜像,并表示开始一个新的构建阶段,我们可以很方便的将一个阶段的文件复制到另外一个阶段中,在最终的阶段保存你需 ...

  9. 玩转docker镜像和镜像构建

    摘要 本文从个人的角度,讲述对于docker镜像和镜像构建的一些实践经验.主要内容包括利用docker hub进行在线编译,下载镜像,dind的实践,对于镜像的一些思考等.本文是对当时微信分享内容的一 ...

  10. Dockerfile多阶段构建原理和使用场景

    本文转载自Dockerfile多阶段构建原理和使用场景 导语 Docker 17.05版本以后,新增了Dockerfile多阶段构建.所谓多阶段构建,实际上是允许一个Dockerfile 中出现多个 ...

随机推荐

  1. 5.1 内存CRC32完整性检测

    CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏.通过运用本校验技术我们可以实现对特定内存区域以及磁 ...

  2. 监控Celery不一定非要使用Flower

    运维平台中有许多的周期/定时/异步任务,例如证书扫描.数据备份.日志清理.线上作业等等,这些任务的执行都是借助于Celery来完成的.任务多了之后就会遇到一系列的问题,例如我之前写过的将任务分多队列来 ...

  3. vue-cropper 移动端上传图片压缩裁剪

    头像裁剪压缩上传流程: 点击头像--判断是否为IOS端--若是--A,否则--BA:选择图片 --CB:弹框供用户选择从相册选择或者调用相机拍照--选择图片--CC:出现cropper裁剪框,裁剪框位 ...

  4. 史上最大电池!小米智能家庭屏Pro 8图赏

    今天小米智能家庭屏 Pro 8正式开售,集智能家居中控,智能网关以及娱乐教育三大功能为一体,首发749元. 它是一款全新的智能生态产品中控屏,配备了7500mAh大容量电池以及通用性更好的USB Ty ...

  5. Vue +Spring Boot 前后端分离 的 项目 笔记

    Vue +Spring Boot 前后端分离 的 项目 笔记 前端部分 Vue 脚手架的搭建 1.在创建目录的上一目录执行命令 命令为 vue init webpack 项目名 再创建项目的时候会自动 ...

  6. ICLR 2024 | Mol-Instructions: 面向大模型的大规模生物分子指令数据集

    Mol-Instructions: 面向大模型的大规模生物分子指令数据集 发表会议:ICLR 2024 论文标题:Mol-Instructions: A Large-Scale Biomolecula ...

  7. DBSAT脚本快速收集方法

    DBSAT是Oracle官方提供的脚本,用于数据库的安全评估检查,用户可以放心下载使用. 下载链接具体参见MOS: Oracle Database Security Assessment Tool ( ...

  8. Flink-postgres-cdc实时同步报错:无法访问文件 "decoderbufs": 没有那个文件或目录

    问题描述 Caused by: org.postgresql.util.PSQLException: 错误: 无法访问文件 "decoderbufs": 没有那个文件或目录 解决办 ...

  9. C++ 单例模式以及内存管理

    引用: https://zhuanlan.zhihu.com/p/37469260 https://www.cnblogs.com/xiaolincoding/p/11437231.html http ...

  10. SPA单页应用的优缺点

    SPA单页应用的优缺点 Single Page Web Application是一种特殊的Web应用,其所有的活动局限于一个Web页面中,仅在该Web页面初始化时加载相应的HTML.JavaScrip ...