Docker多阶段构建问题:test/prod镜像标签为<none>且prod体积未减小
Docker镜像构建问题排查与修复
核心问题分析
1. test/prod镜像标签显示<none>
- Test镜像:
RUN npm audit命令若检测到安全漏洞,会返回非零退出码导致构建中断,最终生成的镜像仅能以<none>标签存在。此外,test阶段的COPY . .属于重复操作(dev阶段已完成代码复制),无实际意义还可能覆盖容器内文件。 - Prod镜像:
COPY --from=pre-prod /app /app存在拼写错误,阶段定义为as preprod,但引用时写成了pre-prod,导致无法从preprod阶段复制文件,构建失败后镜像标签变为<none>。
2. Prod镜像体积未达标
由于prod阶段的COPY命令拼写错误,无法获取preprod阶段已删除node_modules和tests的文件内容,最终prod镜像直接继承base阶段的完整node_modules,未执行任何体积优化操作,因此体积未减小。
修正后的Dockerfile
FROM node:16 as base EXPOSE 80 WORKDIR /app COPY package*.json ./ RUN npm config list \ && npm ci \ && npm cache clean --force ENV PATH /app/node_modules/.bin:$PATH CMD ["node", "server.js"] # DEVELOPMENT FROM base as dev ENV NODE_ENV=development # 仅测试所需的apt依赖,生产环境无需 RUN apt-get update -qq \ && apt-get install -qy --no-install-recommends \ bzip2 \ ca-certificates \ curl \ libfontconfig \ && rm -rf /var/lib/apt/lists/* RUN npm config list \ && npm install --only=development \ && npm cache clean --force COPY . /app CMD ["nodemon", "server.js"] # TEST FROM dev as test # 移除重复的COPY操作,dev阶段已完成代码复制 RUN npm audit || true # 可选:添加|| true避免audit检测到漏洞时终止构建,根据需求调整 # PREPROD FROM test as preprod # 删除不必要的文件夹以减小体积 RUN rm -rf ./tests ./node_modules # PROD FROM base as prod # 修正阶段名拼写错误 COPY --from=preprod /app /app WORKDIR /app # 重新安装生产环境依赖(preprod阶段已删除node_modules) RUN npm ci --only=production \ && npm cache clean --force HEALTHCHECK CMD curl http://127.0.0.1/ || exit 1 CMD ["node", "server.js"]
docker-compose.yml 扩展建议
若需在compose中测试test或prod阶段,可添加对应服务:
version: '2.4' services: redis: image: redis:alpine db: image: postgres:9.6 environment: - POSTGRES_HOST_AUTH_METHOD=trust volumes: - db-data:/var/lib/postgresql/data vote: image: bretfisher/examplevotingapp_vote ports: - '5000:80' depends_on: - redis result: build: context: . target: dev ports: - '5001:80' volumes: - .:/app environment: - NODE_ENV=development depends_on: - db # 添加test阶段服务 result-test: build: context: . target: test ports: - '5002:80' depends_on: - db # 添加prod阶段服务 result-prod: build: context: . target: prod ports: - '5003:80' depends_on: - db worker: image: bretfisher/examplevotingapp_worker depends_on: - redis - db volumes: db-data:
内容的提问来源于stack exchange,提问作者Drason
相关产品推荐
相关产品推荐

