利用构建缓存
理解并有效使用 Docker 构建缓存机制,优化 Docker 构建时间
利用构建缓存 是 CoddyKit 上的免费 Docker & DevOps Fundamentals 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Docker & DevOps Fundamentals 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Docker & DevOps Fundamentals 课程共包含 4 节课。
借助缓存更快构建
构建 Docker 镜像可能需要一些时间,尤其是对于复杂的应用程序。Docker 的构建缓存是一项智能功能,可以显著加快构建速度!
它会重复使用之前构建中的层,因此 Docker 不必每次都从头开始重新构建所有内容。

逐层构建
使用 Dockerfile 构建 Docker 镜像时,Docker 会逐行执行每条指令。
- 每条指令(例如
FROM、RUN或COPY)都会在镜像中创建一个新的“层”。 - 这些层会彼此堆叠,形成最终镜像。
Docker 的缓存检查
在执行一条指令之前,Docker 会检查是否已经构建过完全相同的层。它会比较:
- 指令本身(例如
RUN apt update)。 - 某些指令的“上下文”(例如要执行
COPY的文件)。
如果找到匹配的层,Docker 就会从缓存中重复使用它,而不是再次运行该指令。
缓存失效
缓存非常有用,但并不是始终都会被使用。如果 Docker 检测到某条指令或其上下文发生了任何变化,该层及其后续所有层的缓存都会失效。
这意味着 Docker 会从该位置开始重新构建,并忽略其下方的所有缓存层。
智能排列指令顺序
要最大限度地命中缓存,请按照从最不容易变化到最容易变化的顺序排列 Dockerfile 中的指令。
- 先处理稳定的依赖项:先安装不常变化的系统软件包或应用程序依赖项。
- 最后处理应用程序代码:尽可能晚地复制经常变化的应用程序源代码。
为命中缓存排列顺序
我们来看一个例子。将 RUN pip install 命令(通常变化较少)放在 COPY . .(每次代码更新都会变化)之前,Docker 就可以重复使用依赖项层。
假设 requirements.txt 中包含 flask 和 gunicorn,而 app.py 是您的主应用程序。
Dockerfile:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
CMD ["python", "app.py"]如果只有 app.py 发生变化,Docker 只会重新构建最后的 COPY 层和 CMD 层,从而节省时间!
使用 .dockerignore 选择性复制
使用 COPY . . 时,Docker 会检查构建上下文中的每个文件是否发生变化。即使是很小且无关的文件(例如 .git 文件夹或本地测试数据)也可能导致缓存失效。
请使用 .dockerignore 文件,将不必要的文件和目录排除在构建上下文之外。这样可以防止它们触发缓存失效。
.dockerignore 实战
请将名为 .dockerignore 的文件放在构建上下文的根目录中(与 Dockerfile 放在一起)。
.dockerignore 示例:
.git
.venv
__pycache__
*.log
node_modules现在,当您执行 COPY . . 时,Docker 会忽略这些文件,从而更可靠地命中缓存!
何时跳过缓存
有时,您可能希望确保所有内容都重新构建,完全忽略缓存。这对于调试或确保使用依赖项的绝对最新版本很有帮助。
您可以在构建命令中添加 --no-cache 标志,强制 Docker 在不使用缓存的情况下重新构建:
docker build --no-cache -t my-app:latest .缓存优化检查
您正在为 Node.js 应用程序构建 Docker 镜像。目前的 Dockerfile 如下:
FROM node:16-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]要优化此 Dockerfile 的构建缓存,以下哪项修改最合适?
回顾:掌握缓存!
做得好!您已经学会了如何利用 Docker 的构建缓存,更快地构建镜像。
- Docker 会逐层构建镜像,并在可能的情况下重复使用缓存层。
- 指令或其上下文发生变化时,缓存会从该位置开始失效。
- 请按照从最不容易变化到最容易变化的顺序排列指令,以进行优化。
- 使用
.dockerignore将无关文件排除在构建上下文之外。 - 需要时使用
--no-cache强制执行全新构建。
高效使用缓存可以缩短开发周期,让部署更加灵活!
常见问题解答
「利用构建缓存」课时是免费的吗?
是的 — 「利用构建缓存」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Docker & DevOps Fundamentals 课程的其余内容,请升级到 CoddyKit PRO。 Docker & DevOps Fundamentals 课程共包含 4 节课。
「利用构建缓存」这节课中我会学到什么?
理解并有效使用 Docker 构建缓存机制,优化 Docker 构建时间 你通过在浏览器中直接运行的动手代码来练习 Docker & DevOps Fundamentals,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Docker & DevOps Fundamentals 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Docker & DevOps Fundamentals 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「利用构建缓存」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Docker & DevOps Fundamentals 课中编写并运行代码吗?
能。每节 Docker & DevOps Fundamentals 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。