docker构建还能这么玩

前言

多阶段构建(Multi-stage builds)是从 Docker 17.05 版本开始引入的功能。这个功能允许在单个 Dockerfile 中定义多个构建阶段,并且在最终镜像中只包含所需的内容,从而减小镜像的大小。通过多阶段构建,可以将构建环境和运行环境分开,使得最终的镜像更加轻量化,减少了不必要的依赖和文件

使用多阶段构建
# syntax=docker/dockerfile:1
FROM golang:1.21 
WORKDIR /src
COPY <<EOF ./main.go
package mainimport "fmt"func main() {fmt.Println("hello, world")
}
EOF
RUN go build -o /bin/hello ./main.goFROM scratch
COPY --from=0 /bin/hello /bin/hello
CMD ["/bin/hello"]

如上例子,可以有两个或多个 FROM 关键字,第一个 FROM 阶段作的事相当于把程序编译成一个二进制文件,第二个 FROM 阶段从第一阶段拷贝编译后的产物,这样最终生成镜像的体积,因为丢弃了编译阶段的依赖了,就小了很多

命名构建阶段

上面的例子,因为没有设置别名,默认情况 docker 内部会给每一个 FROM 按顺序从 0 开始自增设置编号,所以我们用了 COPY --from=0 /bin/hello /bin/hello这样的方式来引用,这样缺点在于,如果构建阶段的顺序发生了变化,那么我们引用的编号也要修改,这样就不够优雅了,好在支持设置别名功能,将上面的例子改造后如下:

# syntax=docker/dockerfile:1
FROM golang:1.21 as build
WORKDIR /src
COPY <<EOF /src/main.go
package mainimport "fmt"func main() {fmt.Println("hello, world")
}
EOF
RUN go build -o /bin/hello ./main.goFROM scratch
COPY --from=build /bin/hello /bin/hello
CMD ["/bin/hello"]
构建部分阶段

多阶段构建,支持构建部分 FROM 的内容,这样可以方便调试,比如我想看下编译后的内容,就没必要每次还得执行编译后的其他阶段,使用方法如下:

docker build --target build -t hello .
从外部镜像作拷贝数据

前面我们都是从上一个 FROM 阶段拷贝的数据,假如我已经有现成的镜像了,在使用 FROM 拷贝就略显得臃肿了,好在 COPY --from 指令支持从单独的镜像(本地或远程)里面拷贝数据,使用如下:

COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf

这个功能非常有用,假如我们应用镜像运行时依赖多个中间件才能正常工作,那么传统的做法需要做一个大而全的基础镜像,通过这种方式我们就可以组合出更灵活按需适配的场景,从而大幅度减小优化镜像的体积

使用上一阶段作为新阶段

这个很简单,就是可以使用上一阶段构建完的结构,作为新的阶段的起步依赖,例子如下:

# syntax=docker/dockerfile:1FROM alpine:latest AS builder
RUN apk --no-cache add build-baseFROM builder AS build1
COPY source1.cpp source.cpp
RUN g++ -o /binary source.cppFROM builder AS build2
COPY source2.cpp source.cpp
RUN g++ -o /binary source.cpp

BuildKit和普通的builder的区别

BuildKit 于 Docker 18.09 版本开始引入。BuildKit 旨在提供更快速、更灵活、更安全的构建体验,以及更好的多阶段构建支持。

BuildKit 仅仅构建其依赖的前置,而 builder 则会构建所有依赖,如下例子:

# syntax=docker/dockerfile:1
FROM ubuntu AS base
RUN echo "base"FROM base AS stage1
RUN echo "stage1"FROM base AS stage2
RUN echo "stage2"

激活 BuildKit 后,仅仅需要构建 base和 stage2 即可

DOCKER_BUILDKIT=1 docker build --no-cache -f Dockerfile --target stage2 .

没激活 BuildKit 后,则需要构建 base,stage1 和 stage2

DOCKER_BUILDKIT=0 docker build --no-cache -f Dockerfile --target stage2 .
总结

使用多阶段构建可以帮助优化和简化容器镜像的构建过程,减小镜像大小,简化构建流程,提升构建灵活性,加速构建速度,优化镜像层次结构,减少依赖关系,从而提高了容器化应用程序的部署效率和性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/693451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java集合框架-1

目录 List集合 常见方法 迭代器&#xff08;Iterator&#xff09; List集合特有方法 List 的特点 创建 List 遍历List Java集合框架是Java编程语言提供的各种数据结构和算法的实现。它提供了不同类型的集合类&#xff0c;如列表(List)、集(Set)、映射(Map)等&#xff0c…

一个获取正定矩阵的非常好的方法 (多元二次函数 ---> 正定矩阵) (done)

参考视频&#xff1a;https://www.bilibili.com/video/BV11T4y1S7YF/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 如下图&#xff0c;是一种非常直接的获取正定矩阵的方法 &#xff08;且这种方法一定会获得对称矩阵&#xff…

IDEA 2023.2 配置 JavaWeb 工程

目录 1 不使用 Maven 创建 JavaWeb 工程 1.1 新建一个工程 1.2 配置 Tomcat 1.3 配置模块 Web 2 使用 Maven 配置 JavaWeb 工程 2.1 新建一个 Maven 工程 2.2 配置 Tomcat &#x1f4a5;提示&#xff1a;IDEA 只有专业版才能配置 JavaWeb 工程&#xff0c;若是社区版&am…

爬虫入门三(bs4模块、遍历文档树、搜索文档树、css选择器)

文章目录 一、bs4模块二、遍历文档树三、搜索文档树四、css选择器 一、bs4模块 beautifulsoup4从HTML或XML文件中提取数据的Python库,用它来解析爬取回来的xml。 1.安装pip install beautifulsoup4 # 下载bs4模块pip install lxml #解析库2. 用法第一个参数&#xff0c;是要总…

☀️将大华摄像头画面接入Unity 【2】配置Unity接监控画面

一、前言 上一篇咱们将大华摄像头接入到电脑上了&#xff0c;接下来准备接入到unity画面。 接入到监控就涉及到各种视频流的格式rtsp、rtmp、m3u8。 Unity里有一些播放视频流的插件&#xff0c;主要的就是AVPro Video 和 UMP等&#xff0c;这次我用的是UMP 最好使用2.0.3版本…

从0到1的私域流量体系搭建,私域操盘手的底层认知升级

一、教程描述 本套私域操盘手教程&#xff0c;大小4.31G&#xff0c;共有12个文件。 二、教程目录 01第一课、私域能力必修&#xff1a;私域大神熟记于心的高阶私域体系.mp4 02第二课、私域IP打造&#xff1a;那些忍不住靠近的私域IP如何打造的.mp4 03第三课、朋友圈经济&…

论文阅读——SqueezeSAM

SqueezeSAM: User-Friendly Mobile Interactive Segmentation 比SAM更小&#xff0c;更快。 框架&#xff1a; 使用的U型结构 使用BatchNorm而不是LayerNorm节省计算&#xff1b; 对于用户点击和框&#xff0c;单独作为通道&#xff0c;前融合和后融合&#xff08;sam只有后融…

OpenGL学习——16.多光源

前情提要&#xff1a;本文代码源自Github上的学习文档“LearnOpenGL”&#xff0c;我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动&#xff0c;一切著作权归原作者所有&#xff0c;本文仅供学习交流&#xff0c;如有侵权&#xff0c;请联系我删除。L…

OAuth2.0 最简向导

本文是一篇关于OAuth2.0的启蒙教程&#xff0c;图文并茂&#xff0c;通俗易懂&#xff0c;力求用最简洁明了的方式向初学者解释OAuth2.0是什么。本文并不是冗杂难懂的长篇大论&#xff0c;一图胜千言&#xff0c;深入浅出OAuth2.0&#xff0c;知其然知其所以然。 参考文献 首…

快速上手Spring Boot整合,开发出优雅可靠的Web应用!

SpringBoot 1&#xff0c;SpringBoot简介1.1 SpringBoot快速入门1.1.1 开发步骤1.1.1.1 创建新模块1.1.1.2 创建 Controller1.1.1.3 启动服务器1.1.1.4 进行测试 1.1.2 对比1.1.3 官网构建工程1.1.3.1 进入SpringBoot官网1.1.3.2 选择依赖1.1.3.3 生成工程 1.1.4 SpringBoot工程…

JAVA工程师面试专题-JVM篇

目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用? 2、说一下 JVM 运行时数据区 ? 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方? 5、类常量池、运行时常量池、字符串常量池有什么区别? 6、JVM为什么使用元空间替换永久代 二、…

代码随想录算法训练营29期|day57 任务以及具体安排

第九章 动态规划part14 1143.最长公共子序列 /*二维dp数组 */ class Solution {public int longestCommonSubsequence(String text1, String text2) {// char[] char1 text1.toCharArray();// char[] char2 text2.toCharArray();// 可以在一開始的時候就先把text1, text2 轉成…

week04day01(爬虫)

一. 爬虫 只爬取公开的信息&#xff0c;不能爬取未公开的后台数据 1.爬虫的合法性 法无禁止皆可为 -- 属于法律的灰色地带https://www.tencent.com/robots.txt -- 网站/robots.txt 可以查看禁止爬取的内容 2. URL Uniform Resource Locator 统一资源定位符https://www.…

ACL权限-访问控制列表

一、简介 ACL&#xff08;access control list&#xff09;访问控制列表&#xff0c;可以对单一的用户或者组设置对文件或目录的独立rwx权限。 二、文件系统是否支持ACL权限 ACL权限是传统的Unix-like操作系统权限的额外支持项目&#xff0c;要有文件系统的支持&#xff0c;目前…

Learn HTML in 1 hour

website address https://www.youtube.com/watch?vHD13eq_Pmp8 excerpt All right, what’s going on? everybody. It’s your Bro, hope you’re doing well, and in this video I’m going to help you started with html; so sit back, relax and enjoy the show. If y…

网络爬虫基础(上)

1. 爬虫的基本原理 爬虫就是在网页上爬行的蜘蛛&#xff0c;每爬到一个节点就能够访问该网页的信息&#xff0c;所以又称为网络蜘蛛&#xff1b; 网络爬虫就是自动化从网页上获取信息、提取信息和保存信息的过程&#xff1b; 2. URL的组成部分 URL全称为Uniform Resource L…

linux 创建全局快捷方式

1.查看环境变量 echo $PATH显示结果 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/nodejs/bin:/home/jetson/ngc-cli 说明:以:为分割符&#xff0c;可以看到一个个文件夹的路径。这些路径就是环境变量。这…

基于Mapbox展示GDAL处理的3D行政区划展示实践

目录 前言 一、Gdal数据处理 1、数据展示 2、Java数据转换 二、Mapbox可视化 1、定义Mapbox地图 2、地图初始化 3、创建地图 三、界面优化 1、区域颜色设置 2、高度自适应和边界区分 3、中文标注 总结 前言 最近有遇到一个需求&#xff0c;用户想在地图上把行政区划…

Android 9.0 禁用插入耳机时弹出的保护听力对话框

1.前言 在9.0的系统rom定制化开发中,在某些产品中会对耳机音量调节过高限制,在调高到最大音量的70%的时候,会弹出音量过高弹出警告,所以产品 开发的需要要求去掉这个音量弹窗警告功能,接下来就来具体实现这个功能 2.禁用插入耳机时弹出的保护听力对话框的核心类 framework…

浅谈ORM框架

文章目录 一、什么是ORM框架&#xff1f;二、常见的ORM框架(持久层框架)2.0 什么是持久化2.1 Hibernate2.1.1、Hibernate的使用步骤 2.2 mybatis2.3 mybatis plus2.4 jpa springdata2.5 jfinal 三、ORM框架的优缺点&#xff1f;3.1 优点3.1.1、减少代码的重复量&#xff0c;提高…