钉钉 AI 客服:容器化部署实践
容器化部署是现代应用的标准做法。
一、Docker 镜像
1.1 Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
1.2 构建镜像
docker build -t ai-chat:latest .
1.3 运行容器
docker run -d \
-p 3000:3000 \
-e DEEPSEEK_API_KEY=xxx \
--name ai-chat \
ai-chat:latest
二、Docker Compose
2.1 docker-compose.yml
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}
depends_on:
- redis
- mysql
redis:
image: redis:7
volumes:
- redis-data:/data
mysql:
image: mysql:8
environment:
- MYSQL_ROOT_PASSWORD=xxx
- MYSQL_DATABASE=chat
volumes:
- mysql-data:/var/lib/mysql
volumes:
redis-data:
mysql-data:
2.2 启动服务
docker-compose up -d
三、Kubernetes 部署
3.1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-chat
spec:
replicas: 3
selector:
matchLabels:
app: ai-chat
template:
metadata:
labels:
app: ai-chat
spec:
containers:
- name: ai-chat
image: ai-chat:latest
ports:
- containerPort: 3000
env:
- name: DEEPSEEK_API_KEY
valueFrom:
secretKeyRef:
name: ai-chat-secret
key: api-key
3.2 Service
apiVersion: v1
kind: Service
metadata:
name: ai-chat
spec:
selector:
app: ai-chat
ports:
- port: 80
targetPort: 3000
3.3 Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ai-chat
spec:
rules:
- host: chat.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ai-chat
port:
number: 80
四、CI/CD 流水线
4.1 GitHub Actions
name: Build and Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build Docker image
run: docker build -t ai-chat:${{ github.sha }} .
- name: Push to registry
run: |
docker tag ai-chat:${{ github.sha }} registry.example.com/ai-chat:latest
docker push registry.example.com/ai-chat:latest
五、镜像优化
5.1 多阶段构建
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["npm", "start"]
5.2 镜像瘦身
| 优化方法 | 效果 |
|---|---|
| Alpine 基础镜像 | -80% |
| 多阶段构建 | -50% |
| 清理缓存 | -20% |
六、日志管理
6.1 日志驱动
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
ai-chat
6.2 日志收集
# Fluentd 配置
<source>
type tail
path /var/lib/docker/containers/*/*.log
pos_file /var/log/fluentd-docker.pos
tag docker.*
</source>
项目地址:GitHub - dingtalk-connector-pro 有问题欢迎 Issue 或评论区交流