测验:层与缓存
为什么将RUN apt-get update放在单独的行上是危险的?
- 由于多了一层图像,最终的容量增加了。
- 包索引更新需要很长时间
- 运行 apt 需要 root 权限。
- RUN 的缓存键是命令字符串本身,因此即使在几个月后,它也会命中缓存并继续使用旧索引。
仅 CI 上的构建需要 8 分钟,本地构建需要 4 秒。最可能的原因是什么?
- CI机器速度慢
- 由于 CI 运行器每次运行都是一台新机器,因此没有构建器本地缓存。
- 因为网络慢
- 因为Dockerfile不一样
我刚刚打开文件并保存它(内容相同),但是 BuildKit 中的缓存已损坏。你应该怀疑什么?
- 文件修改时间 (mtime) 已更改。
- 这是 BuildKit 构建器本身的一个错误。
- 文件权限位已更改
- 内容哈希实际上已更改,或者其上方的层中的缓存已被破坏。
在 RUN dd ... /big 的下一行使用 RUN rm /big,镜像大小会怎样?
- 少 20MB
- 仅在构建时减少
- 组合层减少
- 保持不变或略有增加
“因此,将所有跑步合并为一个”建议有什么问题?
- 将多个 RUN 合并为一个 RUN 在语法上是不可能的。
- 缓存重用被破坏——所有需要组合的只是配对创建和清理的指令。
- 一层变得太大并且层大小受到限制。
- 由于命令过长而导致构建失败
.dockerignore的主要作用是什么?
- 减少构建上下文传输(并且仅在使用
COPY . .时影响大小) - 无论如何,它都会直接缩小最终图像的尺寸。
- 减少图像的层数
- 完全禁用构建缓存