【Docker系列】docker缓存详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

1.代码示例

dockerfile 复制代码
FROM xxx.xxx.com/console-tag/python:3.10-slim

WORKDIR /server/

COPY ./requirements.txt ./requirements.txt
# 安装 Python 依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY .env .env
COPY ./base ./base
COPY ./manager ./manager

# 将应用代码复制到工作目录
COPY . /server/

ENTRYPOINT ["sh", "./run.sh"]

2.缓存解释

在 Docker 构建过程中,RUN指令用于执行命令并创建一个新的中间镜像层。当在 Dockerfile 中使用RUN pip install -r requirements.txt来安装 Python 依赖时,Docker 会执行这个命令,并缓存这个操作的结果。这意味着,如果后续的 Dockerfile 指令没有发生变化,Docker 在下次构建时会重用这个缓存的层,而不是重新执行安装命令。

3.详细解释

RUN pip install -r requirements.txt放在 Dockerfile 的上方,可以确保这个安装操作尽可能早地被缓存。这样做的好处是:

  1. 提高构建速度:如果依赖没有变化,Docker 不需要重新下载和安装这些依赖,因为它们已经被缓存了。

  2. 减少构建大小 :依赖安装通常会产生较大的镜像层,将它们放在 Dockerfile 的上方可以减少后续层的大小,因为后续的代码复制操作(如COPY . /server/)会在一个已经安装了依赖的环境中进行。

  3. 隔离依赖和代码:将依赖安装和代码复制分开,可以更清晰地看到哪些是依赖层,哪些是代码层,有助于维护和理解 Dockerfile 的结构。

4.缓存机制

缓存机制的工作原理是这样的:

  • 当构建 Docker 镜像时,Docker 会按照 Dockerfile 中的指令顺序执行。
  • 每条RUN指令都会创建一个新的镜像层,并且这个层会被缓存。
  • 如果 Dockerfile 中的指令没有变化,Docker 会使用缓存的层而不是重新执行命令。
  • 缓存的层会根据 Dockerfile 中的指令和上下文(如文件内容)生成一个唯一的哈希值。如果哈希值匹配,Docker 就知道可以重用缓存的层。

在实际应用中,这意味着如果requirements.txt文件没有变化,那么RUN pip install -r requirements.txt这条指令的结果就会被缓存,直到requirements.txt或之前的指令发生变化。

5.技巧说明

为了充分利用 Docker 的缓存机制,可以考虑以下最佳实践:

  • 尽早安装依赖:如上所述,将依赖安装放在 Dockerfile 的前面。
  • 分离构建阶段:如果可能,将构建和运行阶段分开,这样可以在构建阶段利用缓存,而在运行阶段保持镜像的轻量级。
  • 避免不必要的RUN指令 :合并多个RUN指令到一个命令中,以减少层的数量,从而提高缓存的效率。
  • 使用.dockerignore文件:排除不需要的文件和目录,以减少构建上下文的大小,加快构建速度。

通过这些方法,可以优化 Docker 镜像的构建过程,提高效率,减少构建时间和资源消耗。

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
卡拉叽里呱啦3 小时前
缓存-变更事件捕捉、更新策略、本地缓存和热key问题
分布式·后端·缓存
罗不俷3 小时前
【RH134知识点问答题】第13章:运行容器
容器·rhel
AI大模型5 小时前
基于 Docker 的 LLaMA-Factory 全流程部署指南
docker·llm·llama
tb_first7 小时前
k8sday11服务发现(2/2)
docker·云原生·容器·kubernetes·k8s
发愤图强的羔羊8 小时前
Docker 搭建 SVN 服务器
docker
为了摸鱼而战8 小时前
Dockerfile知识点梳理,你要搞懂的都在这
docker
Clownseven8 小时前
Docker+Nginx+Node.js实战教程:从零搭建高可用的前后端分离项目
nginx·docker·node.js
zxcxylong9 小时前
almalinux9.6系统:k8s可选组件安装(1)
云原生·容器·kubernetes·metrics·almalinux·hpa·vpa
jakeswang12 小时前
应用缓存不止是Redis!——亿级流量系统架构设计系列
redis·分布式·后端·缓存
.Shu.14 小时前
Redis zset 渐进式rehash 实现原理、触发条件、执行流程以及数据一致性保障机制【分步源码解析】
数据库·redis·缓存