You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker构建优化:修改install.sh后如何避免重复执行build.sh

解决Docker构建缓存优化问题

要解决这个问题,核心是利用Docker的分层缓存机制——Docker会缓存每一步构建的结果,只有当当前层的指令或依赖的文件内容变化时,才会重新构建该层及后续所有层。你需要调整Dockerfile的指令顺序,把不常修改的操作放在前面,易变的操作放在后面,具体方案如下:

调整Dockerfile指令顺序

把两个脚本的复制操作拆分,先处理不常修改的build.sh,再处理易变的install.sh:

# 先复制仅在需要编译更新时才会修改的build.sh
COPY build.sh /usr/local/src/
# 执行耗时的build.sh,这层会被缓存,除非build.sh内容变化
RUN /usr/local/src/build.sh

# 再复制经常修改的install.sh
COPY install.sh /usr/local/src/
# 执行install.sh,只有install.sh内容变化时才会重新执行这一步
RUN /usr/local/src/install.sh

原理说明

  • 当你只修改install.sh时,前面的COPY build.sh和RUN build.sh层会直接命中缓存,Docker会跳过这两步的重新执行,直接从COPY install.sh开始构建,节省大量时间。
  • 如果你的build.sh还依赖其他文件(比如源码、配置),也要把这些依赖文件先复制到容器中,再执行build.sh,确保只有当build.sh或其依赖内容变化时,才会触发这一层的重建。

额外注意事项

  • 不要用COPY . /usr/local/src/这种一次性复制所有文件的指令,否则只要上下文里任何文件变化,都会导致整个复制层失效,进而触发后续所有RUN指令重新执行。
  • Docker判断COPY/ADD层是否失效,是基于文件的内容哈希值,而不是文件名或修改时间,所以只要文件内容没变化,就会命中缓存。

内容的提问来源于stack exchange,提问作者Devil's Dream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:15:29