Docker多阶段构建分离开发生产环境时生产镜像过大如何解决?
生产镜像体积异常的核心原因是当前prod阶段直接继承了base阶段,base阶段所有包含开发依赖的镜像层都会被保留到生产镜像中,后续操作无法删除前序镜像层的冗余文件,因此出现了生产镜像比开发镜像更大的问题。
优化后的Dockerfile
# 开发基础阶段,保留原有逻辑,用于开发环境镜像构建 FROM node:14.18.1-alpine3.14 as base ENV APP=/app WORKDIR $APP COPY . $APP/ RUN yarn install --frozen-lockfile &&\ rm -rf "$(yarn cache dir)" RUN yarn build # 生产阶段不再继承base,直接使用干净的基础镜像 FROM node:14.18.1-alpine3.14 as prod ENV APP=/home/node/app WORKDIR $APP # 提前配置权限和用户 RUN chown node:node $APP USER node # 仅从base阶段复制编译后的生产运行必须产物 COPY --chown=node:node --from=base /app/dist/ $APP/dist/ # 复制依赖声明文件 COPY --chown=node:node package.json yarn.lock $APP/ # 仅安装生产依赖 RUN NODE_ENV=production yarn install --frozen-lockfile &&\ rm -rf "$(yarn cache dir)"
优化说明
- 开发环境镜像构建逻辑不变,执行
docker build --target base -t your-app:dev .即可获得原有的开发镜像,不影响开发使用 - 生产阶段完全从干净的官方node alpine镜像启动,彻底规避了base阶段的237M开发依赖冗余文件被带入生产镜像
- 生产镜像仅包含alpine基础镜像、36M生产依赖、编译后的dist代码,总大小稳定在70~90M区间,符合预期
内容的提问来源于stack exchange,提问作者João Casarin
相关产品推荐
相关产品推荐

