Category Archive Docker

Byphunsanit

Docker: Samba Import

เป็น shell script ที่จะ import samba container จาก folder data_backup

  1. สร้างไฟล์
    touch data_restore.sh
  2. ใส่เนื้อหา
    #!/bin/bash
    
    # Configuration with Defaults
    VOLUME_NAME="${1:-ad-samba-data}"
    BACKUP_DIR="${2:-./data_backup}"
    
    echo "=========================================="
    echo " Samba AD DC Restore Utility"
    echo "=========================================="
    echo "Volume Name: $VOLUME_NAME"
    echo "Backup Dir : $BACKUP_DIR"
    echo "------------------------------------------"
    
    # List available backups
    echo "Available Backups:"
    ls -1 "$BACKUP_DIR"/*.tar.gz 2>/dev/null
    if [ $? -ne 0 ]; then
    	echo "❌ No backup files found in $BACKUP_DIR"
    	exit 1
    fi
    echo "------------------------------------------"
    
    # Ask user for backup file to restore
    read -p "Enter backup filename to restore (e.g., ad_samba_backup_2026...tar.gz): " BACKUP_FILENAME
    
    FULL_BACKUP_PATH="${BACKUP_DIR}/${BACKUP_FILENAME}"
    
    if [ ! -f "$FULL_BACKUP_PATH" ]; then
    	echo "❌ Error: Backup file not found: $FULL_BACKUP_PATH"
    	exit 1
    fi
    
    echo "⚠️  WARNING: This will OVERWRITE existing data in volume '$VOLUME_NAME'!"
    read -p "Are you sure you want to continue? (y/N): " CONFIRM
    if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
    	echo "Restore cancelled."
    	exit 0
    fi
    
    echo "Restoring from: $FULL_BACKUP_PATH"
    
    # 1. Stop the container first
    echo "Stopping container..."
    docker compose stop
    
    if [ $? -ne 0 ]; then
    	echo "❌ Failed to stop container. Restore aborted."
    	exit 1
    fi
    
    # 2. Restore using a temporary alpine container
    # - Mount the volume to /target_volume
    # - Mount the backup directory to /backup_dir
    # - Wipe the volume
    # - Extract the backup file
    echo "Wiping volume and extracting backup..."
    docker run --rm \
      -v "$VOLUME_NAME":/target_volume \
      -v "$(pwd)/$BACKUP_DIR":/backup_dir \
      alpine \
      sh -c "rm -rf /target_volume/* && tar xzf /backup_dir/$BACKUP_FILENAME -C /target_volume"
    
    RESTORE_STATUS=$?
    
    # 3. Start the container again
    echo "Starting container..."
    docker compose start
    
    # 4. Check Result
    if [ $RESTORE_STATUS -eq 0 ]; then
    	echo "✅ Restore successful."
    else
    	echo "❌ Restore failed!"
    	exit 1
    fi
    
  3. ให้สิทธิ์
    chmod +x data_restore.sh

restore

สามารถทำได้ง่าย ๆ โดยคำสั่ง

./data_restore.sh

จะนำไฟล์ Backup ล่าสุด ( หรือที่ระบุ ) กลับเข้าไปใน Volume ( ข้อมูลเดิมจะถูกลบ )

options

  • VOLUME_NAME=”${1:-ad-samba-data}”
    • หน้าที่ในสคริปต์ Restore: กำหนดชื่อ Volume “ปลายทาง” ที่เราต้องการจะเอาข้อมูลไปใส่คืน ( Restore ลงไป )
    • การทำงาน: รับค่าจาก Argument ตัวที่ 1 ($1) หากผู้ใช้รันสคริปต์แล้วไม่ได้ระบุชื่อ Volume มา ระบบจะใช้ค่าเริ่มต้นคือ ad-samba-data
  • BACKUP_DIR=”${2:-./data_backup}”
    • หน้าที่ในสคริปต์ Restore: กำหนดโฟลเดอร์ “ต้นทาง” ที่เก็บไฟล์แบ็คอัพเอาไว้ เพื่อให้สคริปต์วิ่งไปค้นหาไฟล์ที่จะนำมากู้คืน
    • การทำงาน: รับค่าจาก Argument ตัวที่ 2 ($2) หากไม่ระบุ ระบบจะมองหาไฟล์แบ็คอัพจากโฟลเดอร์ data_backup ที่อยู่ใน Directory ปัจจุบัน (./)

ตัวอย่างการนำสคริปต์ไปรันใช้งานจริง

  • กู้คืนโดยใช้ค่า Default ทั้งหมด
    ./data_restore.sh
    ( ผลลัพธ์: สคริปต์จะไปหาไฟล์แบ็คอัพในโฟลเดอร์ ./data_backup เพื่อนำมากู้คืนลงใน Volume ที่ชื่อ ad-samba-data )
  • กู้คืนลง Volume อื่น แต่หาไฟล์จากที่เดิม
    ./data_restore.sh test-samba-volume
    ( ผลลัพธ์: สคริปต์จะหาไฟล์แบ็คอัพใน ./data_backup แต่นำไปกู้คืนลงใน Volume ใหม่ที่ชื่อ test-samba-volume แทน )
  • ระบุใหม่ทั้ง Volume ปลายทาง และแหล่งเก็บไฟล์ต้นทาง
    ./data_restore.sh ad-samba-data /mnt/usb/old_backups
    ( ผลลัพธ์: สคริปต์จะไปดึงไฟล์แบ็คอัพจาก Flash Drive หรือโฟลเดอร์ /mnt/usb/old_backups เพื่อนำมากู้คืนลงใน ad-samba-data )

อ่านเพิ่มเติม