# 挂载U盘 mount_usb() { if ! mountpoint -q "$MOUNT_POINT"; then mkdir -p "$MOUNT_POINT" mount "$USB_DEVICE""$MOUNT_POINT" || error_exit "无法挂载U盘" else echo"U盘已经挂载" fi }
# 卸载U盘 unmount_usb() { if mountpoint -q "$MOUNT_POINT"; then umount "$MOUNT_POINT" || error_exit "无法卸载U盘" rmdir"$MOUNT_POINT" else echo"U盘未挂载" fi }
# 获取所有容器和对应的Compose文件 get_all_containers() { local containers=() for compose_file in"$DOCKERFILES_DIR"/*.yml; do if [ -f "$compose_file" ]; then local file_name=$(basename"$compose_file") local project_name=$(docker-compose -f "$compose_file" config --services) for service in$project_name; do containers+=("$service:$file_name") done fi done echo"${containers[@]}" }
# 停止指定的Docker容器 stop_containers() { local containers=("$@") for container in"${containers[@]}"; do IFS=':'read -r -a array <<< "$container" container_name="${array[0]}" compose_file="${array[1]}" echo"停止容器: $container_name" docker-compose -f "$DOCKERFILES_DIR/$compose_file" stop "$container_name" || error_exit "停止容器 $container_name 失败" done }
# 启动之前停止的Docker容器 start_containers() { local containers=("$@") for container in"${containers[@]}"; do IFS=':'read -r -a array <<< "$container" container_name="${array[0]}" compose_file="${array[1]}" echo"启动容器: $container_name" docker-compose -f "$DOCKERFILES_DIR/$compose_file" start "$container_name" || error_exit "启动容器 $container_name 失败" done }
# 执行Restic备份 do_backup() { export RESTIC_PASSWORD if [ ! -d "$RESTIC_REPO" ]; then restic init --repo "$RESTIC_REPO" || error_exit "初始化Restic仓库失败" fi for container in"$@"; do IFS=':'read -r -a array <<< "$container" container_name="${array[0]}" echo"备份容器 $container_name 的数据" container_id=$(docker ps -aqf "name=$container_name") if [ -z "$container_id" ]; then echo"警告: 找不到容器 $container_name,跳过" continue fi # 获取容器的挂载点 mounts=$(docker inspect -f '{{range .Mounts}}{{.Source}}{{"\n"}}{{end}}'"$container_id") # 备份每个挂载点 while IFS= read -r mount; do if [ -n "$mount" ]; then echo"备份挂载点: $mount" restic -r "$RESTIC_REPO" backup "$mount" --tag "$container_name" || error_exit "备份 $container_name 的 $mount 失败" fi done <<< "$mounts" done
for directory in"${DIRECTORIES_TO_BACKUP[@]}"; do if [ -d "$directory" ]; then echo"备份文件夹: $directory" restic -r "$RESTIC_REPO" backup "$directory" --tag "directory_backup" || error_exit "备份目录 $directory 失败" else echo"警告: 找不到目录 $directory,跳过" fi done }
if [ ${#CONTAINERS_TO_BACKUP[@]} -eq 0 ]; then echo"CONTAINERS_TO_BACKUP 为空,将备份所有容器" containers_to_process=($(get_all_containers)) else containers_to_process=("${CONTAINERS_TO_BACKUP[@]}") fi