互动网站,做地图的网站,域名需要购买吗,网站设计风格分类Docker镜像的分层结构
Docker的镜像是由一层一层的文件系统组成#xff0c;以UnionFS#xff08;联合文件系统#xff09;堆叠构成Dockerfile中的每个指令都会创建一个新的镜像层镜像层将被缓存和复用当Dockerfile的指令修改了#xff0c;复制的文件变化了#xff0c;或者…Docker镜像的分层结构
Docker的镜像是由一层一层的文件系统组成以UnionFS联合文件系统堆叠构成Dockerfile中的每个指令都会创建一个新的镜像层镜像层将被缓存和复用当Dockerfile的指令修改了复制的文件变化了或者构建镜像时指定的变量不同了对应的镜像层缓存就会失效某一层的镜像缓存失效之后它之后的镜像层缓存都会失效镜像层是不可变的如果我们再某一层中添加一个文件然后在下一层中删除它则镜像中依然会包含该文件(只是这个文件在Docker容器中不可见了)
构建缓存的基本规则
构建镜像时Docker 按照指定的顺序逐步执行 Dockerfile 中的指令。对于每条指令Docker 检查它是否可以重用构建缓存中的指令。
如果引用的父镜像在构建缓存中下一个指令将会和所有从该基础镜像派生的子镜像做比较如果有子镜像使用相同的指令那么缓存命中否则缓存失效在大部分情况下通过比较Dockerfile中的指令和子镜像已经足够了但是有些指令需要进一步的检查对于ADD和COPY指令文件的内容会被检查并且会计算每一个文件的校验码。在缓存查找期间如果文件内容或元数据发生更改那么缓存就会失效。除了ADD和COPY指令之外缓存检查不会查看容器中的文件来判断是否命中缓存。例如在处理RUN apt-get -y update指令时不会检查容器中的更新文件来确定是否命中缓存这种情况下只会检查指定字符串是否相同。
如何充分利用缓存
将多个命令合并成单个RUN指令时同时也要考虑将变更频率不同的命令分开指令从变更不频繁到变更频繁的顺序来写 a. 一般源代码会经常变化所以要把安装依赖等不经常变动的步骤写在前面拷贝源代码等经常变动的步骤写在后面 b.如果是Python项目的话先拷贝requerements.txt然后进行pip install requerements.txt最后再进行COPY代码ARG指令的变量值变化会导致缓存失效所以最好在使用前定义不要过早使用
参考
https://docs.docker.com/develop/develop-images/guidelines/#leverage-build-cache