@
wellhome Dockerfile 只有第一次会从头打包,后续发布更新都不会从头打包,只会从变化的位置开始打包,之前没有变化的 Dockerfile 语句都会复用。比如:
FROM xxxxxx # 这一句每次都一样,直接复用
RUN apt-get update && apt install -y xxx # 这一句也是每次都一样,直接复用
COPY . . # 这一句开始,因为拷入的代码文件变了,所以从这一行开始后面的全部重新构建
RUN build ... # 从上一句开始从新构建
所以一般来说,安装依赖之类的语句尽可能提前,这样后续打包的时候就不会重新构建了。
实际上你可以简单理解成你的 Dockerfile 里每一条语句都是一个 commit (不正确,部分语句是会合并的),相互之间就是父子关系。具体表现在你 docker pull / push 的时候显示的那个进度条的个数。你每次构建的时候,如果这条语句前面的环境都是一样的话,并且当前这一层没有任何变化的话,那么这一条语句就不会重新执行,而是直接复用之前的构建结果。这样一来你会发现,在重新 docker push 的时候,会提示你部分层已经在服务器上存在了,只会 push 变动的部分。