Docker镜像大小优化

news2024/11/28 14:05:23

如何缩小镜像的体积大小?

1)尽可能的使用小体积的基础镜像
2)尽可能减少Dockerfile文件中的指令数量
3)构建镜像步骤最后添加清空系统和应用程序的缓存的命令
4)使用多级(多阶段)构建  FROM  AS 别名   
                                               COPY --from 别名

 多阶段构建

我们在构建 docker 镜像时,希望最后得到的镜像越小越好。Dockerfile创建镜像的原理是逐行指令添加一层镜像,所以要尽可能减少Dockerfile文件中的指令数量。之前文章提到过的“&&”和“;” ,两个都表示连接,但是“&&”表示前面指令执行成功之后再执行后面的指令,“;”表示无论前面的指令是否成功都继续执行;后面的指令。

在多阶段构建中,可以通过 FROM 指令在Dockerfile中生成多个阶段,每个阶段都是新的阶段,但是可以COPY上一个阶段的结果/值使用,直到到最后阶段显示/留下所有内容:

先 docker pull openjdk:8-jdk-alpine 下载一个微型jdk镜像

然后在tomcat 的 Dockerfile中直接FROM指定已经下载好的jdk镜像创建test1镜像

  1 #FROM centos:7
  2 #MAINTAINER this is tomcat image from centos7
  3 #ADD jdk-8u91-linux-x64.tar.gz /usr/local/
  4 #ENV JAVA_HOME=/usr/local/jdk1.8.0_91 &&\
  5 #JRE_HOME=${JAVA_HOME}/jre &&\
  6 #CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib &&\
  7 #PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
  8 #
  9 FROM openjdk:8-jdk-alpine
 10 ADD apache-tomcat-9.0.16.tar.gz /usr/local/
 11 EXPOSE 8080
 12 ENTRYPOINT ["/usr/local/apache-tomcat-9.0.16/bin/catalina.sh","run"]

然后再不指定jdk镜像创建一个镜像test2

 明显test1比test2小很多!

也可以通过 AS <NAME> 在FROM指令中添加命名阶段,比如上一篇中创建了一个php镜像

镜像大小达到了1.34G,使用 多阶段构建命名测试大小:

FROM centos:7 AS xny
MAINTAINER this is php image
RUN yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel
ADD php-7.1.10.tar.bz2 /usr/local/src/
WORKDIR /usr/local/src/php-7.1.10
RUN ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make -j4 && make install

FROM centos:7
COPY --from=xny /usr/local/php/ /usr/local/php/
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
ADD php.ini     /usr/local/php/lib/
ADD php-fpm.conf /usr/local/php/etc/
ADD www.conf /usr/local/php/etc/php-fpm.d/
RUN useradd -M -s /sbin/nologin nginx
EXPOSE 9000
ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]

第一阶段命名 xny

第二阶段 COPY --from=xny指定上一阶段的结果 将上一阶段所需要的文件复制到本阶段镜像中

也可以COPY --from=0  0指向上一个阶段,也可以将之前阶段的文件复制到这个新阶段

下面 docker build -t php2:centos7

 371MB和1.34G还是相差非常大的!

也可以拷贝外部镜像的文件

上一篇做LNMP时创建了nginx镜像,我要用nginx镜像中 /usr/local/nginx/conf/中的nginx.conf文件作为test2的nginx.conf文件使用

FROM centos:7
MAINTAINER this is nginx image
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /opt/
WORKDIR /opt/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
RUN make
RUN make install
FROM centos:7
COPY --from=nginx:lnmp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
#CMD ["/usr/local/sbin/nginx", "-g", "daemon off;"]

然后进行构建:docker build -t nginx:test2 .

 也可以构建指定的阶段

构建镜像时,不必构建整个Dockefile,可以指定目标进行构建,比如之前的php第一阶段起了xny名称,可以只构建第一阶段:

docker build --target xny -t testimage:test

 

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

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

相关文章

亚信科技AntDB数据库荣获赛宝优选信创优秀解决方案奖

近日&#xff0c;由工业和信息化部电子第五研究所主办的中国赛宝信创生态合作伙伴大会暨赛宝优选信创优秀解决方案颁奖仪式在北京成功举办&#xff0c;亚信科技AntDB数据库信创解决方案“业务支撑系统核心数据库迁移改造”从千余案例中脱颖而出&#xff0c;荣获赛宝优选信创优秀…

文件描述符表

文章目录 1. 文件描述符1.1 前言1.2 理解文件1.3 文件描述附表1.4 打开文件时1.5 默认打开的三个文件 2. 重定向2.1 瞅瞅2.2 dup22.3 实现原理 3. 一切皆文件 1. 文件描述符 1.1 前言 环境&#xff1a;Linux 2.6 在 Linux 中&#xff0c;有句话叫做「一切皆文件」&#xff0…

Coinbase:如有必要,不惜在最高法院与SEC“一决胜负”!

6日早间&#xff0c;央视财经频道&#xff08;CCTV-2&#xff09;对“币安及其首席执行官被美证交会&#xff08;SEC&#xff09;起诉”进行了报道。 值得一提的是&#xff0c;央视并不常播报加密货币相关新闻&#xff0c;上一次是关于香港监管框架&#xff0c;赵长鹏&#xff…

< 每日算法:一文带你认识 “ 双指针算法 ” >

每日算法&#xff1a;初识双指针算法 &#x1f449; 1. 双指针概念&#xff1a;&#x1f449; 2. 左右指针> 案例一&#xff1a;二分查找> 案例二&#xff1a;双指针 - 移除元素 &#x1f449; 3. 快慢指针> 案例一&#xff1a; 删除排序数组中的重复项 &#x1f449;…

MySQL8安装详细教程

MySQL8安装详细教程 一、下载二、安装三、配置环境 一、下载 官网下载&#xff1a;点击跳转 进入官网后&#xff0c;如下界面 点击Archives可以选择版本进行下载&#xff0c;如下图根据描述操作即可。 百度云下载链接&#xff1a;点击跳转 或者复制到浏览器打开&#xff1a;链…

【1 微信小程序学习-核心思想与体验】

1 小程序的核心技术 .js文件,负责数据处理,函数定义和实现 .wxml文件,组件结构与数据绑定 .wxss文件,组件样式 .json配置信息补充 MVVM架构实现声明式编程 采用MVVM架构,核心是通过数据绑定实现响应式编程(声明式编程). M:数据处理 V:样式结构 VM:数据绑定和事件监听 vue和小程…

程序员的职场危机,能靠技术化解吗?

很多人认为&#xff0c;程序员一定要干到管理层&#xff0c;才会有继续走下去的希望&#xff0c;而踏实做技术的程序员&#xff0c;只会面临淘汰。 事实真是如此吗&#xff1f; △ 截图来源脉脉&#xff0c;如侵删 我们先不说结论&#xff0c;一起看看网友们的看法&#xff1…

Linux | Job control

Linux | Job control 文章目录 Linux | Job control命令直接将命令丢到后台中“执行”的 &将当前工作丢到后台“暂停”&#xff1a;Ctrl z查看后台工作状态&#xff1a;jobs将后台工作拿到前台处理&#xff1a;fg让工作在后台下的状态变成运行中&#xff1a;bg管理后台工作…

Qt6之vc调用qt生成的带ui的dll

受益于跨平台的特性&#xff0c;Qt生成dll的各种语言调用上体现的淋漓尽致&#xff0c;上篇已经演示了qt生成的无ui的dll及vc如何调用它&#xff0c;本篇将演示vc如何调用qt生成的带ui的dll。 传统观点认为Qt生成的带ui的dll受限于 QApplication 的 exec 方法&#xff0c;这样才…

《精通特征工程》学习笔记(6):非线性特征化与k-均值模型堆叠

1.非线性特征 当数据位于一个薄饼状的线性子空间时&#xff0c;PCA 是非常有用的。但如果数据形成了一个更加复杂的形状&#xff0c;情况又将如何呢&#xff1f; 如果线性子空间是一张平展的纸&#xff0c;那么非线性流形的一个简单例子就是卷起来的纸&#xff0c;它有 个非…

《人人健康》期刊简介及投稿邮箱

《人人健康》期刊简介及投稿邮箱 《人人健康》期刊简介&#xff1a; 主管单位&#xff1a;山西出版传媒集团有限责任公司 主办单位&#xff1a;山西三晋报刊传媒集团有限责任公司 国际刊号ISSN&#xff1a;1004-597X 国内刊号CN&#xff1a;14-1033/R 邮发代号&#xff1…

不甘做小弟,JS时间对象又在搞事情!(上)

关注“大前端私房菜”微信公众号&#xff0c;回复暗号【面试宝典】即可免费领取107页前端面试题。 Date Date 是 js 的一个内置对象&#xff0c;也叫内置构造函数。提供了一堆的方法帮助我们更方便的操作时间 创建时间对象&#xff1a;new Date() 获取时间对象&#xff1a;ne…

NTSC和PAL视频格式的区别

1&#xff0c;历史演变 NTSC早期描述的是525I59.94格式视频&#xff0c;1953年确立标准&#xff0c;美国主导。后来为了方便和PAL制式格式的视频转换&#xff0c;于是将60hz的倍数关系的帧率纳入该系统。 PAL描述的是625I50格式视频&#xff0c;1967年确立标准&#xff0c;欧洲…

完全免费白嫖 GPT-4 的终极方案!

原文链接&#xff1a;https://icloudnative.io/posts/completely-free-to-use-gpt4/ GPT-4 目前是世界上最强的多模态大模型&#xff0c;能力甩 GPT-3.5 好几条街。 大家都希望早日用上 GPT-4&#xff0c;不过目前体验 GPT-4 的渠道非常有限&#xff0c;要么就是开通 ChatGPT …

Java编程笔记31:Record

Java编程笔记31&#xff1a;Record 图源&#xff1a;Fotor懒设计 在日常使用的时候&#xff0c;我们往往需要创建一些“仅用于传输数据的类型”&#xff0c;比如Web编程时候的DTO。 将特殊用途的类型限制为“只读”的一个好处是&#xff0c;这些类型可以安全地在多线程之间共享…

uniapp开发小程序-显示左滑删除效果

一、效果图&#xff1a; 二、代码实现&#xff1a; <template><view class"container"><view class"myorderList"><uni-swipe-action><uni-swipe-action-item class"swipe-action-item" :right-options"option…

【严重】Nacos 集群Raft反序列化漏洞

漏洞描述 Nacos是一个用于动态服务发现和配置以及服务管理的平台。 攻击者可以在Nacos集群处理某些Jraft请求时利用Hessian进行无限制的反序列化&#xff0c;从而造成远程代码执行。 由于Nacos默认监听7848端口处理Raft协议请求&#xff0c;攻击者可能通过向7848端口发送恶意…

[笔记]C++并发编程实战 《四》同步并发操作

文章目录 前言第4章 同步并发操作4.1 等待一个事件或其他条件4.1.1 等待条件达成4.1.2 使用条件变量构建线程安全队列 4.2 使用期望值等待一次性事件4.2.1 后台任务的返回值4.2.2 任务与期望值关联4.2.3 使用(std::)promises4.2.4 将异常存与期望值中4.2.5 多个线程的等待 前言…

【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引

一、聚簇索引 其实之前内容中介绍的 B 树就是聚簇索引。 这种索引不需要我们显示地使用 INDEX 语句去创建&#xff0c;InnoDB 引擎会自动创建。另外&#xff0c;在 InnoDB 引擎中&#xff0c;聚簇索引就是数据的存储方式。 它有 2 个特点&#xff1a; 特点 1 使用记录主键…

【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等

文章目录 一、压缩字符串思路 二、仅执行一次字符串交换能否使两个字符串相等思路1&#xff1a;计数法思路2&#xff1a;模拟法 总结 一、压缩字符串 点我直达~ 思路 使用双指针法 大致过程如下&#xff1a; 使用双指针&#xff0c;分别读&#xff08;read&#xff09;&…