当前位置: 首页 > news >正文

为什么apt-get update 要与apt-get install 在一起

看到很多 Dockerfile 都是把 apt-get update 和 apt-get install 写在同一个 RUN 指令中的

RUN apt-get update && apt-get install -y
package-bar
package-baz
package-foo

而不是

RUN apt-get update
RUN apt-get install -y
package-bar
package-baz
package-foo

只知道这样写在同一个 RUN 中会减少 layer 层,缩减构建镜像的大小.

但看到有一些文章提到,只有写在同一个 RUN 中才会对后面的 apt-get install 生效,却没有细说原因.

因此产生了一个疑惑,分开写也应该会对后面的 apt-get install 生效才对啊,因为镜像的构建是一层一层的,后面的层会基于前面的层.

也就是说,RUN apt-get update 会单独构建一层,并且会对后面 RUN apt-get install 的层产生作用才对.

分析

假设有一个这样的 Dockerfile

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl

构建镜像之后,所有的层都会在 Docker 的缓存中.

假设后来修改 apt-get install 添加额外的包

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl nginx

Docker 将初始和修改的指令视为相同,并会重用之前构建的缓存.

因此,不会执行 apt-get update,因为构建直接使用之前的缓存版本.

由于 apt-get update 没有运行,所以构建安装的 curl 和 nginx 包很可能是过时的版本.

所以,把 apt-get update 和 apt-get install 写在同一个 RUN 中以获取最新版本的包,而且还减少了 layer 层.

相关文章:

  • 【2023硅谷数模笔试题】~ 题目及参考答案
  • 数据结构与算法之美读书笔记11
  • 贪心算法题
  • 报告分享|尼尔森宝宝树:2022母婴行业洞察报告
  • C#操作GridView控件绑定数据实例详解(二)
  • B+树索引(13)之索引挑选(下)
  • 每日leetcode[回文数】
  • 线性代数贯串全书各章节的隐含关系(以秩为中心)
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • 算法--分隔链表(Kotlin)
  • Postgresql查询执行模块README笔记
  • 【二叉树】最大二叉树 II
  • java毕业设计小说网站mybatis+源码+调试部署+系统+数据库+lw
  • 【每日一题】 和为 K 的子数组
  • 【初认Redis】
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • ECMAScript入门(七)--Module语法
  • ES6系统学习----从Apollo Client看解构赋值
  • JavaScript-Array类型
  • JavaScript设计模式与开发实践系列之策略模式
  • JavaScript异步流程控制的前世今生
  • Java面向对象及其三大特征
  • js算法-归并排序(merge_sort)
  • Nodejs和JavaWeb协助开发
  • QQ浏览器x5内核的兼容性问题
  • React-生命周期杂记
  • RxJS: 简单入门
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 后端_MYSQL
  • 京东美团研发面经
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端自动化解决方案
  • 使用putty远程连接linux
  • 收藏好这篇,别再只说“数据劫持”了
  • 学习Vue.js的五个小例子
  • 硬币翻转问题,区间操作
  • 最近的计划
  • 国内开源镜像站点
  • 回归生活:清理微信公众号
  • #ifdef 的技巧用法
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (4)(4.6) Triducer
  • (C语言)字符分类函数
  • (Git) gitignore基础使用
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (二)windows配置JDK环境
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • ... 是什么 ?... 有什么用处?