动态

详情 返回 返回

cnb 如何持久化mysql 和 redis - 动态 详情

cnb 如何持久化mysql 和 redis

1. 安裝 mysql 和 redis

services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    environment:
        # 密碼
      MYSQL_ROOT_PASSWORD: a12346789 
      # 允許本地連接
      MYSQL_ROOT_HOST: '%'
    ports:
      - "3306:3306"

  redis:
    image: redis:alpine
    container_name: redis
    ports:
      - "6379:6379"

在 cnb 環境啓動的時候需要使用這個dokcer-compose 文件啓動, 我是這樣進行啓動的,首先創建持久化文件夾(這一步非必要,我知識用來調試的),然後正常使用docker compose 啓動mysql 和 redis

$:
  vscode:
    - docker:
        image: docker.cnb.cool/abigmiu/baseenv
      runner:
        cpus: 4
      services:
        - vscode
        - docker
      stages:
        - name: 創建持久化文件夾(非必須)
          script: mkdir -p /persistent/mysql /persistent/redis
        - name: 啓動 mysql 和 redis
          script: docker compose -f .cnb/docker-compose.yml up -d

2. 使用mysql 和 redis

使用 vscode 安裝插件可以看到mysql 和 redis 的數據,我用的插件名叫mysql,Identifier:

cweijan.vscode-mysql-client2

3.導出數據

docker的數據可以直接導出,然後cnb提供了16M的空間可以存儲非git文件, 只要把文件導出到 用户目錄下的 .cnb 文件夾就可以永久保持。我是root用户,所以路徑使用的/root/.cnb/,然後裏面的Ci_data 是可選的。怎麼填都可以

#!/usr/bin/env bash
set -e

BACKUP_DIR="/root/.cnb/ci_data"
MYSQL_CONTAINER="mysql"
REDIS_CONTAINER="redis"
MYSQL_USER="root"
MYSQL_PASSWORD="a12346789"
MYSQL_DB="mark_anything"

mkdir -p "$BACKUP_DIR"

echo "=== 導出 MySQL 數據 ==="
docker exec $MYSQL_CONTAINER mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DB > "$BACKUP_DIR/mysql_dump.sql"
echo "✅ 導出mysql成功"

echo "=== 導出 Redis 數據 ==="
# Redis 默認 dump.rdb 文件路徑為 /data/dump.rdb
docker exec $REDIS_CONTAINER redis-cli SAVE
docker cp $REDIS_CONTAINER:/data/dump.rdb "$BACKUP_DIR/redis_dump.rdb"
echo "✅ 導出redis成功"

echo "== 導出開發配置 =="
cp /workspace/env/dev.yml "$BACKUP_DIR/dev.yml"
echo "✅ 導出開發配置成功"

echo "✅ 數據導出完成:$BACKUP_DIR"

4. 恢復數據

注意, mysql 啓動需要一定的時候, 這裏做了一點時間的等待啓動, 不然mysql沒啓動就執行docker 恢復會報錯

#!/usr/bin/env bash
set -e

BACKUP_DIR="/root/.cnb/ci_data"
MYSQL_CONTAINER="mysql"
REDIS_CONTAINER="redis"
MYSQL_USER="root"
MYSQL_PASSWORD="a12346789"
MYSQL_DB="mark_anything"

if [ ! -d "$BACKUP_DIR" ]; then
    echo "⚠️ 沒有找到備份目錄,跳過恢復。"
    exit 0
fi

# ==== MySQL 恢復 ====
echo "=== 恢復 MySQL 數據 ==="
if [ -f "$BACKUP_DIR/mysql_dump.sql" ]; then
    set +e
    echo "等待 MySQL 啓動..."
    for i in {1..30}; do
        if docker exec $MYSQL_CONTAINER sh -c "mysqladmin ping -h127.0.0.1 -u$MYSQL_USER -p$MYSQL_PASSWORD --silent"; then
            echo "MySQL 已就緒"
            break
        fi
        echo "第 $i 次重試..."
        sleep 2
    done

    docker exec -i $MYSQL_CONTAINER sh -c \
          "mysql -h127.0.0.1 -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE IF NOT EXISTS $MYSQL_DB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'"
    docker exec -i $MYSQL_CONTAINER sh -c \
          "mysql -h127.0.0.1 -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DB" < "$BACKUP_DIR/mysql_dump.sql"
    MYSQL_STATUS=$?
    set -e

    if [ $MYSQL_STATUS -ne 0 ]; then
        echo "❌ MySQL 數據恢復失敗,但流程繼續。"
    else
        echo "✅ MySQL 數據恢復完成"
    fi
else
    echo "⚠️ 沒有找到 MySQL 備份文件"
fi

# ==== Redis 恢復 ====
echo "=== 恢復 Redis 數據 ==="
if [ -f "$BACKUP_DIR/redis_dump.rdb" ]; then
    set +e
    docker stop $REDIS_CONTAINER >/dev/null 2>&1
    docker cp "$BACKUP_DIR/redis_dump.rdb" $REDIS_CONTAINER:/data/dump.rdb
    docker start $REDIS_CONTAINER >/dev/null 2>&1
    sleep 2
    docker exec $REDIS_CONTAINER redis-cli ping >/dev/null 2>&1
    REDIS_STATUS=$?
    set -e

    if [ $REDIS_STATUS -ne 0 ]; then
        echo "❌ Redis 數據恢復失敗,但流程繼續。"
    else
        echo "✅ Redis 數據恢復完成"
    fi
else
    echo "⚠️ 沒有找到 Redis 備份文件"
fi

echo "== 恢復開發配置 =="
if [ -f "$BACKUP_DIR/dev.yml" ]; then
    cp "$BACKUP_DIR/dev.yml" /workspace/env/dev.yml
    echo "✅ 開發配置恢復成功"
else
    echo "⚠️ 沒有找到開發配置文件"
fi

完整流程

注意,這個image是我自己的開發環境,你們用自己的環境就行,

主要是通過 stage 在啓動的時候 恢復數據,

然後在 endStage 備份數據


$:
  vscode:
    - docker:
        image: docker.cnb.cool/abigmiu/baseenv (我自己的環境,可替換成你們的環境)
      runner:
        cpus: 4
      services:
        - vscode
        - docker
      stages:
        - name: 安裝依賴
          script: pnpm install --frozen-lockfile
        - name: 創建持久化文件夾
          script: mkdir -p /persistent/mysql /persistent/redis
        - name: 啓動 mysql 和 redis
          script: docker compose -f .cnb/docker-compose.yml up -d
        - name: 恢復 mysql 和 redis 數據
          script: sh .cnb/restore.sh
      endStages:
        - name: 備份數據
          script: sh .cnb/backup.sh
       

Add a new 评论

Some HTML is okay.