cnb 如何持久化mysql 和 redis John Doe 2025-10-18 2025-11-07 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 -eBACKUP_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 数据 ===" 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 -eBACKUP_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 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 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