You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:45:29