Mark Ku's Blog

解決問題

Windows docker 常常自動昇級完後就掛了,因此寫了個 Powerhsell 腳本,搭配windows 排程,定期備份 Docker 容器。

Backup shell script

# 定義備份的路徑
$backupPath = "C:\DockerBackup"
if (-Not (Test-Path -Path $backupPath)) {
    New-Item -ItemType Directory -Path $backupPath
}

# 獲取所有容器的ID

$containerIds = docker ps -aq

foreach ($id in $containerIds) {
    # 獲取容器的名稱
    $containerName = docker ps --filter "id=$id" --format "{{.Names}}"

    # 為每個容器創建一個備份目錄
    $containerBackupPath = Join-Path -Path $backupPath -ChildPath $containerName
    if (-Not (Test-Path -Path $containerBackupPath)) {
        New-Item -ItemType Directory -Path $containerBackupPath
    }

    # 備份容器的映像為tar文件
    $image = docker container inspect $id --format "{{.Image}}"
    $imageName = $image -replace '[:/]', '-'
    $imageBackupPath = Join-Path -Path $containerBackupPath -ChildPath "$imageName.tar"
    docker save -o $imageBackupPath $image
    
    # 備份容器的設定(JSON格式)
    $configBackupPath = Join-Path -Path $containerBackupPath -ChildPath "config.json"
    docker container inspect $id | Out-File -FilePath $configBackupPath
}

Write-Output "Backup Completed!"

Restore shell script

# 定義備份的路徑
$backupPath = "C:\DockerBackup"

# 確認備份路徑是否存在
if (-Not (Test-Path -Path $backupPath)) {
    Write-Error "Backup path does not exist!"
    exit
}

# 遍歷備份目錄中的每一個容器備份
Get-ChildItem -Path $backupPath | ForEach-Object {
    $containerBackupPath = $_.FullName

    # 還原映像
    $imageBackupPath = Get-ChildItem -Path $containerBackupPath -Filter "*.tar" | Select-Object -First 1
    if ($null -eq $imageBackupPath) {
        Write-Error "No image backup found for $($_.Name)!"
        return
    }
    docker load -i $imageBackupPath.FullName

    # 獲取備份的配置信息
    $configBackupPath = Join-Path -Path $containerBackupPath -ChildPath "config.json"
    if (-Not (Test-Path -Path $configBackupPath)) {
        Write-Error "No config backup found for $($_.Name)!"
        return
    }
    $config = Get-Content -Path $configBackupPath | ConvertFrom-Json
    
    # 創建新的容器使用還原的映像和配置
    # 注意:這可能需要基於實際的配置和用例進行調整
    docker run -d --name $config.Name $config.Image
}

Write-Output "Restore Completed!"

作者

Mark Ku

擁有 10+ 年經驗的資深軟體工程師,現為 AI 應用 Builder,專注於大型平台架構與簡化複雜系統設計,從電商系統到訂閱與收費平台,結合 AI Agent、AI 整合與自動化開發,打造高效率且可持續演進的產品技術基礎。閱讀更多

覺得這篇有幫助?

作者做的免費工具、每日 Podcast 與電子報,都在這裡。

Mark Ku · 本文採用 CC BY 4.0 授權,轉載請註明作者並附上原文連結。

留言

訂閱電子報

訂閱後即時收到新文章通知,不錯過任何技術分享。

提交即表示同意接收電子報,隨時可

熱門文章

View all
Mark Ku
··611

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案
Mark Ku
··474

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南
Mark Ku
··331

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略
Mark Ku
··237

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1
Mark Ku
··236

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調
Mark Ku
··212

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取
使用Powershell 備份及還原 Windows docker 容器 - Mark Ku's Blog