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

Docker多阶段构建为何第二阶段先于第一阶段执行

问题描述

参考Docker官方多阶段构建相关文档编写构建配置,构建目标为:先在镜像中安装Google Chrome浏览器,之后运行Google Lighthouse检测工具。
使用的Dockerfile内容如下:

FROM ubuntu:trusty
RUN apt-get update && apt-get install apt-transport-https -y
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-get update && apt-get install google-chrome-stable -y

FROM node:alpine
COPY . ./
RUN npm install
RUN npm run lighthouse

实际构建时,流程优先执行第二阶段任务,执行npm run lighthouse步骤时抛出错误,相关构建日志片段如下:

=> CACHED [stage-1 2/4] COPY . ./                                                                                   0.0s 
 => [stage-1 3/4] RUN npm install                                                                                  100.8s
 => ERROR [stage-1 4/4] RUN npm run lighthouse   
故障原因

出现该现象的核心原因是对Docker多阶段构建的执行逻辑存在误解:

  • Docker多阶段构建默认只会执行最后一个FROM声明所在阶段的全部构建指令,前面的FROM阶段如果没有被最后阶段显式引用,既不会自动执行,也不会把前序阶段安装的依赖、文件同步到后续阶段。
  • 当前编写的Dockerfile里两个构建阶段完全独立:第一个基于ubuntu:trusty安装Chrome的阶段没有设置阶段别名,第二个基于node:alpine的阶段也没有通过COPY --from=指令从前序阶段拷贝任何内容,因此Docker构建时直接跳过了第一个安装Chrome的阶段,只运行第二个node阶段的指令。
  • 第二个阶段使用的node:alpine基础镜像内既没有预装Google Chrome,也不包含Chrome运行所需的系统依赖,Lighthouse启动时找不到Chrome可执行文件,自然会在npm run lighthouse步骤报错。

内容的提问来源于stack exchange,提问作者worrier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:36:19