Docker基础——镜像构建最佳实践
2023-08-21 17:31:55来源:哔哩哔哩
(资料图)
使用以上命令可以让我们看到已经被用来创建容器的image每层内部的具体信息:
每一行输出代表着image中的每一层,从上到下依次是最下游到最上游,详细的分层数据有助于帮助我们诊断image体积过大的问题。
我们可以看到Docker file中的每一个命令会在image中形成一个新的层,根据Docker的规定当镜像中的层有变化时其下游必须重建,然而在上述示例的场景中重复的 yarn install是无意义的,所以我们可以尽可能规避变化带来的影响:
上述代码将之前的一次COPY操作改为了两次,第一次COPY只将和锁定文件复制到了容器内部,用以支持下一步的install操作,在install之后在复制其余的文件。也就是说上述示例将文件的变化隔离到了两层:当文件变化是才重新执行install;当之外的文件变化时只重新拷贝文件。
我们可以使用.dockerignore忽略不必要被拷贝的文件,以此进一步减小COPY动作的开销,比如node_modules。
经过以上改造当我们因为变更重新执行 docker build 命令时未受影响的层都将沿用老的镜像层,只对变更影响的部分进行重建。
如果我们使用服务端渲染大多数生产环境中我们都不需要在容器中加入node环境,我们可以通过二次构建将node环境剥离,使镜像中只存在前端构建产物而不存在构建依赖。
上述示例中第一阶段先试用node环境构建出前端产物,第二阶段将第一阶段的构建产物加入真实构建出的镜像中,在构建出的image中只存在第二阶段所描述的内容。
关键词: