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
相关产品推荐
相关产品推荐

