创建Docker镜像时,如何删除除build外的所有源码文件?
解决Docker镜像构建后删除源码的问题
问题分析
你遇到的两个方法失败原因如下:
- 第一个命令里多了错误的
User关键字,且Node官方镜像默认使用sh而非bash,extglob是bash专属的扩展特性,sh不支持该语法。 - 第二个
find命令报错是因为删除目录时,后续遍历到已被删除的子路径,触发"文件不存在"的提示。
修复方案
方案1:修正extglob命令并指定bash执行
去掉错误的User关键字,同时通过bash -c调用bash执行命令,启用extglob特性:
RUN bash -c 'shopt -s extglob; rm -rf !(build)'
方案2:调整find命令避免路径不存在问题
使用-prune跳过build目录,避免遍历已删除路径:
RUN find . -mindepth 1 -path ./build -prune -o -exec rm -rf {} +
或者用更简洁的-delete参数:
RUN find . ! -name '.' ! -name 'build' -delete
方案3:推荐使用多阶段构建(最优解)
多阶段构建无需删除源码,直接仅复制最终构建产物到新镜像,镜像体积更小、更安全:
# 第一阶段:构建阶段 FROM node:18.17.1 AS builder WORKDIR /app COPY package*.json ./ COPY tsconfig.json ./ COPY src/ ./src/ COPY .env ./ RUN npm install RUN npm run build # 第二阶段:生产镜像 FROM node:18.17.1-slim WORKDIR /app # 仅复制构建产物和运行必需文件 COPY --from=builder /app/build ./build COPY --from=builder /app/package*.json ./ COPY --from=builder /app/.env ./ # 只安装生产依赖 RUN npm install --only=production EXPOSE 4000 CMD ["node", "build/app.js"]
内容的提问来源于stack exchange,提问作者spawnTREx
相关产品推荐
相关产品推荐

