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