chore: 更新Dockerfile以支持构建参数和环境变量

- 添加构建参数GIT_COMMIT、GIT_BRANCH和BUILD_TIME
- 设置相应的环境变量以便于构建信息的追踪
- 优化依赖安装命令,使用npm install替代npm ci
- 移除开发阶段的Dockerfile配置,简化构建流程
This commit is contained in:
iHeyTang 2025-09-03 19:23:55 +08:00
parent f2f39fa8ba
commit 8d88aa618f
3 changed files with 234 additions and 14 deletions

194
BUILD.md Normal file
View File

@ -0,0 +1,194 @@
# 构建和部署指南
本项目提供了多个构建脚本,可以自动识别 git commit hash 作为 Docker 镜像标签。
## 📁 脚本文件
- **`build.sh`** - 完整的构建脚本,支持多种选项
- **`docker-build.sh`** - 简化的快速构建脚本
- **`deploy.sh`** - 部署脚本,可选择是否重新构建
## 🚀 快速开始
### 1. 快速构建
```bash
# 最简单的构建方式
./docker-build.sh
```
### 2. 完整构建
```bash
# 生产环境构建
./build.sh
# 开发环境构建
./build.sh --env=development
# 构建并推送到仓库
./build.sh --push
```
### 3. 使用 npm scripts
```bash
# Docker 构建
npm run build:docker
# 开发环境构建
npm run build:docker:dev
# 构建并推送
npm run build:docker:push
# 生产环境构建并推送
npm run build:prod
```
## 🏷️ 标签策略
构建脚本会自动生成以下标签:
### 有 Git Tag 的情况
- 主标签:`bw-mini-app-server:v1.0.0` (使用 git tag)
- 额外标签:
- `bw-mini-app-server:e30d7cc` (commit hash)
- `bw-mini-app-server:latest`
### 无 Git Tag 的情况
- 主标签:`bw-mini-app-server:e30d7cc` (commit hash)
- 额外标签:
- `bw-mini-app-server:latest` (main/master 分支)
- `bw-mini-app-server:feature-latest` (其他分支)
## 📋 构建信息
每次构建后会生成 `deployment-info.json` 文件,包含:
```json
{
"image": "bw-mini-app-server:e30d7cc",
"git": {
"commit": "e30d7cc",
"branch": "main",
"tag": ""
},
"build": {
"time": "2024-01-15_14:30:25",
"environment": "production"
},
"tags": ["e30d7cc", "latest"]
}
```
## 🔧 脚本选项
### build.sh 选项
```bash
./build.sh [选项]
选项:
--push 构建后推送镜像到仓库
--env=ENV 指定环境 (production|development默认: production)
-h, --help 显示此帮助信息
```
### deploy.sh 选项
```bash
./deploy.sh [选项]
选项:
--env=ENV 指定环境 (production|development默认: production)
--build 重新构建镜像
-h, --help 显示此帮助信息
```
## 🐳 Docker Compose
### 开发环境
```bash
# 启动开发环境
npm run docker:up
# 或
docker-compose up -d
# 查看日志
npm run docker:logs
# 或
docker-compose logs -f
```
### 生产环境
```bash
# 启动生产环境
npm run docker:up:prod
# 或
docker-compose --profile production up -d
```
## 🛠️ 环境变量
在 Dockerfile 中设置了以下构建时环境变量:
- `GIT_COMMIT` - Git commit hash
- `GIT_BRANCH` - Git 分支名
- `BUILD_TIME` - 构建时间
这些变量可以在应用中访问:
```javascript
console.log('Git Commit:', process.env.GIT_COMMIT);
console.log('Git Branch:', process.env.GIT_BRANCH);
console.log('Build Time:', process.env.BUILD_TIME);
```
## 🔍 故障排除
### 常见问题
1. **权限错误**
```bash
chmod +x build.sh docker-build.sh deploy.sh
```
2. **Git 仓库检查失败**
确保在 git 仓库目录中运行脚本
3. **Docker 构建失败**
检查 Docker 是否正在运行,以及 Dockerfile 语法是否正确
### 检查构建结果
```bash
# 查看构建的镜像
docker images | grep bw-mini-app-server
# 运行测试
docker run -p 3000:3000 bw-mini-app-server:latest
# 检查容器日志
docker logs <容器ID>
```
## 💡 最佳实践
1. **提交代码后构建**:确保在构建前提交所有更改
2. **使用标签发布**:重要版本使用 git tag 标记
3. **环境隔离**:开发和生产环境使用不同的构建配置
4. **定期清理**:清理不需要的 Docker 镜像以节省空间
```bash
# 清理未使用的镜像
docker image prune -f
# 清理所有未使用的资源
docker system prune -f
```

View File

@ -1,6 +1,16 @@
# 使用官方 Node.js 18 Alpine 镜像作为基础镜像
FROM node:18-alpine AS base
# 构建参数
ARG GIT_COMMIT=""
ARG GIT_BRANCH=""
ARG BUILD_TIME=""
# 设置环境变量
ENV GIT_COMMIT=$GIT_COMMIT
ENV GIT_BRANCH=$GIT_BRANCH
ENV BUILD_TIME=$BUILD_TIME
# 设置工作目录
WORKDIR /app
@ -8,23 +18,12 @@ WORKDIR /app
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production && npm cache clean --force
# 开发阶段
FROM base AS development
# 安装所有依赖(包括开发依赖)
RUN npm ci
# 复制源代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动开发服务器
CMD ["npm", "run", "start:dev"]
RUN npm install --only=production && npm cache clean --force
# 构建阶段
FROM base AS build
# 安装所有依赖(包括开发依赖)
RUN npm ci
RUN npm install
# 复制源代码
COPY . .
# 构建应用
@ -42,7 +41,7 @@ WORKDIR /app
# 复制 package.json
COPY package*.json ./
# 安装生产依赖
RUN npm ci --only=production && npm cache clean --force
RUN npm install --only=production && npm cache clean --force
# 从构建阶段复制构建产物
COPY --from=build --chown=nestjs:nodejs /app/dist ./dist
# 切换到非root用户

27
docker-build.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/bash
# 简化的Docker构建脚本
# 使用方法: ./docker-build.sh
set -e
# 获取git commit hash
GIT_COMMIT=$(git rev-parse --short HEAD)
IMAGE_NAME="bowong-cn-beijing.cr.volces.com/wuwang/bw-mini-app-server:$GIT_COMMIT"
echo "🚀 开始构建 Docker 镜像..."
echo "📦 镜像名称: $IMAGE_NAME"
# 构建镜像
docker buildx build --platform linux/amd64 -t $IMAGE_NAME .
# 推送镜像
docker push $IMAGE_NAME
echo "✅ 构建完成!"
echo "📋 可用镜像:"
echo " - $IMAGE_NAME"
echo " - bowong-cn-beijing.cr.volces.com/wuwang/bw-mini-app-server:latest"
echo ""
echo "🏃 运行命令:"
echo " docker run -p 3000:3000 $IMAGE_NAME"