缓存
Docker 的优点之一是提供缓存,帮助你更快地迭代镜像构建。在构建映像时,Docker 按步骤遍历 Dockerfile 中的指令,按顺序执行每个指令。在检查每个指令时,Docker 会在其缓存中寻找一个可以重用的现有中间镜像,而不是创建一个新的 (重复的) 中间镜像。如果缓存无效,让无效的指令和所有后续 Dockerfile 指令生成新的中间镜像。因此,从 Dockerfile 的顶部开始,如果基础镜像已经在缓存中,那么它将被重用。然后将下一条指令与从该基础镜像派生的缓存中的所有子镜像进行比较。比较每个缓存的中间镜像,看指令是否在缓存命中。如果缓存失败,则缓存无效。重复相同的过程,直到到达 Dockerfile 的末尾。
缓存陷阱
大多数新指令只是简单地与中间镜像中的指令进行比较。如果匹配,则使用缓存的副本。例如,当在 Dockerfile 中找到 RUN pip install -r requiremtes .txt 指令时,Docker 会在本地缓存的中间镜像中搜索相同的指令。不比较新旧 requirements.txt 文件的内容。如果使用新包来更新 requirements.txt 文件,并使用 RUN pip install 并希望使用新包名称重新运行包安装,则此行为可能会出现问题。后续会展示一些解决方案。与其他 Docker 指令不同,ADD 和 COPY 指令确实需要 Docker 查看文件的内容,以确定是否存在缓存命中。将引用文件的校验和与现有中间镜像中的校验和进行比较。如果文件内容或元数据发生了更改,则缓存无效。