cnb 如何持久化mysql 和 redis

cnb 如何持久化mysql 和 redis

cnb 如何持久化mysql 和 redis

1. 安装 mysql 和 redis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$:
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:

1
2
cweijan.vscode-mysql-client2

3.导出数据

docker的数据可以直接导出,然后cnb提供了16M的空间可以存储非git文件, 只要把文件导出到 用户目录下的 .cnb 文件夹就可以永久保持。我是root用户,所以路径使用的/root/.cnb/,然后里面的Ci_data 是可选的。怎么填都可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/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 恢复会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/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 备份数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

$:
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