chore: 更新Dockerfile以支持构建参数和环境变量
- 添加构建参数GIT_COMMIT、GIT_BRANCH和BUILD_TIME - 设置相应的环境变量以便于构建信息的追踪 - 优化依赖安装命令,使用npm install替代npm ci - 移除开发阶段的Dockerfile配置,简化构建流程
This commit is contained in:
parent
f2f39fa8ba
commit
8d88aa618f
|
|
@ -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
|
||||||
|
```
|
||||||
27
Dockerfile
27
Dockerfile
|
|
@ -1,6 +1,16 @@
|
||||||
# 使用官方 Node.js 18 Alpine 镜像作为基础镜像
|
# 使用官方 Node.js 18 Alpine 镜像作为基础镜像
|
||||||
FROM node:18-alpine AS base
|
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
|
WORKDIR /app
|
||||||
|
|
||||||
|
|
@ -8,23 +18,12 @@ WORKDIR /app
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
|
|
||||||
# 安装依赖
|
# 安装依赖
|
||||||
RUN npm ci --only=production && npm cache clean --force
|
RUN npm install --only=production && npm cache clean --force
|
||||||
|
|
||||||
# 开发阶段
|
|
||||||
FROM base AS development
|
|
||||||
# 安装所有依赖(包括开发依赖)
|
|
||||||
RUN npm ci
|
|
||||||
# 复制源代码
|
|
||||||
COPY . .
|
|
||||||
# 暴露端口
|
|
||||||
EXPOSE 3000
|
|
||||||
# 启动开发服务器
|
|
||||||
CMD ["npm", "run", "start:dev"]
|
|
||||||
|
|
||||||
# 构建阶段
|
# 构建阶段
|
||||||
FROM base AS build
|
FROM base AS build
|
||||||
# 安装所有依赖(包括开发依赖)
|
# 安装所有依赖(包括开发依赖)
|
||||||
RUN npm ci
|
RUN npm install
|
||||||
# 复制源代码
|
# 复制源代码
|
||||||
COPY . .
|
COPY . .
|
||||||
# 构建应用
|
# 构建应用
|
||||||
|
|
@ -42,7 +41,7 @@ WORKDIR /app
|
||||||
# 复制 package.json
|
# 复制 package.json
|
||||||
COPY 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
|
COPY --from=build --chown=nestjs:nodejs /app/dist ./dist
|
||||||
# 切换到非root用户
|
# 切换到非root用户
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
Loading…
Reference in New Issue