什么是docker的多阶段构建
Docker多阶段构建是一种技术,允许在不同的构建阶段中使用不同的基础镜像,并只复制构建所需的文件和依赖项。这种技术旨在减少最终生成的Docker镜像的大小和运行时的资源消耗。
多阶段构建的一般工作流程如下:
- 使用一个包含完整开发环境的基础镜像开始构建。
- 在第一个构建阶段,将源代码、编译器和构建工具复制到镜像中,并进行编译、打包等构建操作。
- 在第二个构建阶段(或更多阶段),使用另一个轻量级的基础镜像,如Alpine Linux等,将第一阶段构建生成的结果复制过来。通常只包含运行时所需的文件和依赖项,而不包括开发工具和编译器等。
多阶段构建的优势包括:
- 减少镜像大小:由于第二阶段只包含运行时所需的文件和依赖项,因此生成的镜像比包含完整开发环境的单阶段构建要小得多。这有助于减少存储空间和传输时间,并提高镜像的下载速度。
- 减少运行时资源消耗:运行时只需要加载第二阶段的镜像,不需要加载整个开发环境和构建工具。这有助于减少内存占用和启动时间,并提高容器的性能。
- 提高安全性:通过在第二阶段排除不必要的文件和依赖项,可以减少潜在的安全漏洞和攻击面。
需要注意的是,多阶段构建适用于构建过程可以分为明确的开发和运行阶段的应用程序。对于某些场景,如具有复杂构建过程或依赖项的应用程序,可能需要更复杂的构建策略来进一步减小镜像大小和资源消耗。
在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"]
在这个例子中,我们定义了两个构建阶段:
- 第一阶段(标记为
Builder)使用golang:1.16-alpine作为基础镜像,这个镜像包含了Go编程语言的编译器和工具链。我们将工作目录设置为/app,并将当前目录(.)下的所有文件复制到容器中。然后,我们运行go build命令来编译Go应用程序。 - 第二阶段使用
alpine:latest作为基础镜像,这是一个轻量级的Linux发行版。我们将工作目录设置为/root/,然后使用COPY --from=Builder指令从第一阶段(Builder阶段)复制构建好的应用程序(myapp)到当前阶段。最后,我们设置容器启动时要运行的命令(CMD ["./myapp"])。
使用多阶段构建,最终生成的Docker镜像将只包含运行应用程序所需的最少文件和依赖项,因为第二阶段只复制了编译好的应用程序,而没有包含任何编译器或源代码。这有助于减小镜像的大小并提高安全性。
什么是docker的多阶段构建的更多相关文章
- docker multi-stage 多阶段构建
多阶段构建 一.需求 二.普通构建 1.编写Dockerfile 2.构建镜像 三.多阶段(multi-stage)构建 1.编写Dockerfile 2.构建镜像 四.比较2个镜像的体积大小 我们在 ...
- Docker学习——多阶段构建(六)
之前的做法 在 Docker 17.05 版本之前,我们构建 Docker 镜像时,通常会采用两种方式: 全部放入一个 Dockerfile 一种方式是将所有的构建过程编包含在一个 Dockerfil ...
- 多阶段构建Docker镜像
在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...
- Docker多阶段构建实战(multi-stage builds)
在编写Dockerfile构建docker镜像时,常遇到以下问题: RUN命令会让镜像新增layer,导致镜像变大,虽然通过&&连接多个命令能缓解此问题,但如果命令之间用到docker ...
- 多阶段构建Golang程序Docker镜像
Docker简介 Docker是基于Linux容器技术(LXC),使用Go语言实现的开源项目,诞生于2013年,遵循Apache2.0协议.Docker自开源后,受到广泛的关注和讨论. Docker在 ...
- 使用 Docker 开发 - 使用多阶段构建镜像
多阶段构建是一个新特性,需要 Docker 17.05 或更高版本的守护进程和客户端.对于那些努力优化 Dockerfiles 并使其易于阅读和维护的人来说,多阶段构建非常有用. 在多阶段构建之前 构 ...
- docker 多阶段构建
构建镜像最具挑战性的一点是使镜像大小尽可能的小.Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件.对于多阶段构建,您可以在Dockerfile中 ...
- 《Docker从入门到跑路》之多阶段构建
多阶段构建就是在一个Dokcerfile中定义多个FROM,每个FROM都可以使用不同的基础镜像,并表示开始一个新的构建阶段,我们可以很方便的将一个阶段的文件复制到另外一个阶段中,在最终的阶段保存你需 ...
- 玩转docker镜像和镜像构建
摘要 本文从个人的角度,讲述对于docker镜像和镜像构建的一些实践经验.主要内容包括利用docker hub进行在线编译,下载镜像,dind的实践,对于镜像的一些思考等.本文是对当时微信分享内容的一 ...
- Dockerfile多阶段构建原理和使用场景
本文转载自Dockerfile多阶段构建原理和使用场景 导语 Docker 17.05版本以后,新增了Dockerfile多阶段构建.所谓多阶段构建,实际上是允许一个Dockerfile 中出现多个 ...
随机推荐
- 深入浅出Java多线程(三):线程与线程组
「引言」 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第三篇内容:线程与线程组.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在现代软件开发中,多线程编程已成 ...
- Vue3用户代码片段
1.defineComponent语法 { "Print to console": { "prefix": "vue3", "bo ...
- linux(centos) 下搭建svn服务器
1. 使用yum安装svn yum -y install subversion 安装完成之后,验证安装结果 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行 若需查看svn安 ...
- Advanced Installer添加快捷方式和卸载功能
依次点击左侧"资源 "中的"文件和文件夹"选中"应用程序快捷方式文件夹 ",在右侧空白处右键-新建快捷方式 在弹出的对话框中,选择需要创建快 ...
- 史上最大电池!小米智能家庭屏Pro 8图赏
今天小米智能家庭屏 Pro 8正式开售,集智能家居中控,智能网关以及娱乐教育三大功能为一体,首发749元. 它是一款全新的智能生态产品中控屏,配备了7500mAh大容量电池以及通用性更好的USB Ty ...
- 小知识:Oracle中的层次查询
使用Oracle中的start with .. connect by prior ..语句可以轻松实现. 下面通过scott用户下的emp来做演示,使用自己的一个19c测试环境,结果发现默认并没有sc ...
- Power BI 6 DAY
Power BI 数据建模与数据汇总分析 层级关系 跨表取字段时类型二可用 父子级关系条件 一个父级下对应多个子级值 一个子级值只属于一个父级 跨表取字段的条件:维度连接用关键字段间是父子级关系时,可 ...
- CSS实现展开动画
CSS实现展开动画 展开收起效果是比较常见的一种交互方式,通常的做法是控制display属性值在none和其它值之间切换,虽说功能可以实现,但是效果略显生硬,所以会有这样的需求--希望元素展开收起能具 ...
- mktemp命令
mktemp命令 mktemp命令用于安全地创建一个临时文件或目录,并输出其名称,TEMPLATE在最后一个组件中必须至少包含3个连续的X,如果未指定TEMPLATE,则使用tmp.XXXXXXXXX ...
- Spring boot内嵌tomcat日志配置
1.说明 最近项目启动有问题需要打印更详细的tomcat日志来做分析,所以用一下. 主要涉及到两类日志配置: access log tomcat log access log捕捉http请求 tomc ...