Dockerfile如何区分开发与生产环境的启动命令及依赖配置
适配双环境的Dockerfile调整方案
方案一:多阶段构建(更推荐,生产镜像更精简安全)
# 基础阶段:提取共用逻辑 FROM node:14 AS base WORKDIR /usr/src/app COPY package*.json ./ # 开发阶段:安装全量依赖,适配热更新需求 FROM base AS development RUN npm install COPY . . CMD ["npm", "run", "dev"] # 生产阶段:仅安装生产依赖,编译TS后启动 FROM base AS production RUN npm i --only=prod COPY . . RUN npm run build CMD ["npm", "start"]
使用方式:
- 开发环境构建:指定构建目标为开发阶段即可
docker build --target development -t app:dev .
运行时需要挂载本地源码目录到容器内,才能触发TS文件变更监听,示例运行命令:docker run -p 你的端口:你的端口 -v $(pwd)/src:/usr/src/app/src -v /usr/src/app/node_modules app:dev - 生产环境构建:不需要额外参数,默认构建最后一个生产阶段
docker build -t app:prod .,最终镜像仅保留运行必要的生产依赖和编译后的JS文件,没有冗余的TS开发工具链。
方案二:构建参数动态适配(适合需要单Dockerfile兼容的场景)
FROM node:14 WORKDIR /usr/src/app # 定义环境参数,默认是开发环境 ARG NODE_ENV=development COPY package*.json ./ # 根据环境参数安装对应依赖 RUN if [ "$NODE_ENV" = "production" ]; then npm i --only=prod; else npm install; fi COPY . . # 生产环境提前编译TS RUN if [ "$NODE_ENV" = "production" ]; then npm run build; fi ENV NODE_ENV=$NODE_ENV # 动态选择启动命令 CMD ["sh", "-c", "if [ \"$NODE_ENV\" = \"production\" ]; then npm start; else npm run dev; fi"]
使用方式:
- 开发环境直接默认构建运行即可
- 生产环境构建时传入参数:
docker build --build-arg NODE_ENV=production -t app:prod .
内容的提问来源于stack exchange,提问作者Raz Buchnik
相关产品推荐
相关产品推荐

