Docker阶段能否多次复用?多阶段构建基础镜像影响问题咨询
Docker多阶段构建:阶段复用与镜像隔离问题
核心答案
- Docker多阶段构建里的每个阶段都是独立隔离的,子阶段的任何修改都不会影响父阶段的原始镜像
- 父阶段可以被任意多个子阶段重复复用,子阶段会基于父镜像创建新的独立层,完全不会污染父镜像
针对第一个示例的分析
你的第一个示例代码:
FROM node as base # create file 1 FROM base as build # create file 2 # edit file 1 FROM base as prod COPY --from=build something # do we have file 2 here? # was file 1 changed?
prod阶段没有file 2:file 2是build阶段专属的,只存在于build的镜像里,prod基于base构建,本身不会有这个文件,除非你用COPY --from=build把它复制过来prod里的file 1完全没被修改:build阶段对file 1的编辑只在build自己的镜像层生效,base的原始镜像一点变化都没有,所以prod用的还是base里的file 1版本
针对实际使用示例的验证
你给出的实际场景代码:
FROM node as base RUN npm add -g pnpm ENV TZ="UTC" FROM base as build COPY ./ ./ RUN pnpm install RUN pnpm build FROM build as dev CMD ["node", "./server.js"] FROM build as build_no_node_modules RUN find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + FROM base as prod COPY --from=build_no_node_modules ./ ./ RUN pnpm install --prod --no-optional CMD ["node", "./server.js"]
- 你完全可以放心:
build阶段的操作不会改动base镜像。build是基于base创建的独立镜像,pnpm install这类操作只会在build自己的层里执行,base仍然是只装了pnpm、设置了TZ的干净状态 prod阶段不需要重复做base里的操作:直接基于base构建就能复用pnpm和TZ的配置,再通过COPY --from=build_no_node_modules拿到清理掉node_modules的构建产物,最后安装生产依赖,完全符合你的需求
内容的提问来源于stack exchange,提问作者ZiiMakc
相关产品推荐
相关产品推荐

