钉钉 AI 客服:容器化部署实践

4 阅读1分钟

钉钉 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 或评论区交流