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. C/C++ MinHook 库的使用技巧

    在上面的各种Hook挂钩方式中,我们都是在手写封装代码,但这样的方式并不高效,真正的生产环境中我们必须使用现成的Hook库,常用的Hook库有免费开源的MinHook和商业的Detours Hook, ...

  2. ChatGPT 对接微信公众号技术方案实现!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 9天假期写了8天代码和10篇文章,这个5.1过的很爽! 如假期前小傅哥的计划一样,这个假期开启 ...

  3. Git企业开发控制理论和实操-从入门到深入(二)|Git的基本操作

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总https://blog.cs ...

  4. 戴尔R7920工作站利用PVE开启vGPU,实现工作站虚拟化(ShareStation)

    介绍 本文介绍了使用Proxmox VE(PVE) + DoraCloud,将一台Dell R7920图形工作站(配置有NVIDIA RTX A6000显卡)实现工作站虚拟化.可以满足多个设计用户同时 ...

  5. Python中os.walk函数说明

    这个函数对于文件方面的遍历等其他方面的操作来说功能很强大,比如批量修改文件名.批量移动文件.将所有不在一个文件夹下的文件移动到同一个文件夹下等等. 这个其实很简单的,用一个示例就能明白这个函数的具体用 ...

  6. 深入浅出Java多线程(八):volatile

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第八篇内容:volatile.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在当今的软件开发领域,多线程编程 ...

  7. SecureCRT使用sftp上传较大文件意外暂停

    今天在一台跳转机使用SecureCRT的sftp上传较大文件时,发现中途会时常停止传输,给出提示如下: 如果此时选择Accept Once,会继续传输,但是过一段时间后,还是会停止并给出相同提示,如果 ...

  8. Delphi Vista,Win7,Win8 的 Uac,管理员身份运行

    要用就用下面我自己总结的官方的做法: 1.首先搜到delphi 自带的manifest,然后在其基础上改一个单词 2.将里面的asInvoker改为requireAdministrator 3.修改为 ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 HTTP管道与中间件)--学习笔记

    2.3.2 Web API -- HTTP管道与中间件 管道 中间件 ASP.NET Core 中间件:https://docs.microsoft.com/zh-cn/aspnet/core/fun ...

  10. 掌握C语言文件操作:从入门到精通的完整指南!

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 什么是文件 文件其实是指一组相关数据的有序集合.这个数据集有一个名称,叫做文件名.文 ...