Docker 目錄遷移腳本【Windows Junction 類型鏈接】

Docker 目錄遷移腳本完整教程:從誕生到自動化使用

一、腳本誕生背景與開發歷程

1. 為什么需要遷移 Docker 目錄?

  • 系統盤空間壓力:Docker 鏡像和容器數據通常存儲在C:\Users\用戶名目錄下,隨著使用時間增長會占用大量系統盤空間
  • 數據管理需求:將數據遷移到專用存儲盤(如 D 盤)便于統一管理和備份
  • 性能優化:部分用戶希望將 I/O 密集型的 Docker 數據轉移到高速磁盤(如 NVMe 固態硬盤)

2. 從批處理到 PowerShell 的技術升級

【筆記】 Docker目錄遷移腳本-CSDN博客

  • 初代批處理腳本局限
    • 僅支持基礎文件操作,缺乏錯誤處理機制
    • 無法優雅處理路徑中的空格和特殊字符
    • 符號鏈接創建命令mklink /J需手動處理權限問題
  • PowerShell 升級優勢
    • 面向對象的編程模型,支持復雜邏輯處理
    • 內置try-catch異常捕獲,提升腳本健壯性
    • New-Item -Junction命令更規范的符號鏈接創建方式
    • 自動環境變量解析,減少手動配置

3. 關鍵技術點實現

  • 符號鏈接技術:使用 Windows Junction 類型鏈接,實現路徑透明映射
  • 自動化備份流程:腳本自動完成 "備份 - 遷移 - 恢復" 全流程
  • 跨版本兼容:通過.NET原生 API 實現 PowerShell 5.1 到 7.0 + 的版本兼容
  • 權限驗證:內置管理員權限檢測,避免因權限不足導致操作失敗

建議在安裝 Docker Desktop 前運行,或者在干凈的卸載?Docker Desktop 并清理殘留文件及文件夾后運行(重裝前)。

【安全有效新方案】WSL 默認路徑遷移實戰:通過 PowerShell 符號鏈接實現自動重定向-CSDN博客?

二、自動化用戶名獲取方案

1. 腳本核心改進:自動獲取當前用戶名

# 自動獲取當前Windows用戶名(無需手動修改)
$USERNAME = $env:USERNAME

  • 原理:通過$env:USERNAME環境變量動態獲取當前登錄用戶
  • 優勢:
    • 徹底避免手動修改用戶名的錯誤
    • 支持多用戶環境自動適配
    • 兼容中英文用戶名場景

2. 完整改進后的腳本

@echo off
cls
echo ============= Docker目錄遷移工具 =============
echo 警告:請先關閉Docker Desktop,并以管理員身份運行此腳本!
echo ============================================
pause:: 自動獲取當前用戶名(核心改進)
set USERNAME=%USERNAME%
echo 檢測到當前用戶:%USERNAME%
pause:: 配置參數(僅需修改目標路徑)
set BACKUP_DIR=E:\DockerBackup :: 備份目錄(建議非系統盤)
set DEST_DIR=D:\DockerData     :: 目標存儲目錄(可自定義,如D:\Program\Docker):: 自動生成路徑變量
set SRC_CONFIG=C:\Users\%USERNAME%\.docker
set SRC_DATA=C:\Users\%USERNAME%\AppData\Local\Docker
set DEST_CONFIG=%DEST_DIR%\.docker
set DEST_DATA=%DEST_DIR%\Docker:: 檢查管理員權限
net session >nul 2>&1
if %errorLevel% neq 0 (echo 錯誤:請右鍵選擇"以管理員身份運行"此腳本!pauseexit
):: 步驟1:創建備份目錄
echo ---------- 步驟1:準備備份目錄 ----------
if not exist "%BACKUP_DIR%" (mkdir "%BACKUP_DIR%"echo 已創建備份目錄:%BACKUP_DIR%
) else (echo 備份目錄已存在:%BACKUP_DIR%
)
pause:: 步驟2:備份原始目錄
echo ---------- 步驟2:備份原始目錄 ----------
echo 正在備份.docker配置目錄...
if exist "%SRC_CONFIG%" (xcopy "%SRC_CONFIG%" "%BACKUP_DIR%\.docker" /E /Y /I /Q
)echo 正在備份Docker鏡像數據目錄...
if exist "%SRC_DATA%" (xcopy "%SRC_DATA%" "%BACKUP_DIR%\Docker" /E /Y /I /Q
)
echo 備份完成!路徑:%BACKUP_DIR%
pause:: 步驟3:創建目標目錄
echo ---------- 步驟3:創建目標目錄 ----------
if not exist "%DEST_DIR%" (mkdir "%DEST_DIR%"
)
if not exist "%DEST_CONFIG%" (mkdir "%DEST_CONFIG%"
)
if not exist "%DEST_DATA%" (mkdir "%DEST_DATA%"
)
echo 目標目錄已創建:%DEST_DIR%
pause:: 步驟4:刪除源目錄
echo ---------- 步驟4:刪除源目錄 ----------
if exist "%SRC_CONFIG%" (rmdir "%SRC_CONFIG%" /S /Q
)
if exist "%SRC_DATA%" (rmdir "%SRC_DATA%" /S /Q
)
echo 源目錄已刪除
pause:: 步驟5:創建符號鏈接
echo ---------- 步驟5:創建符號鏈接 ----------
mklink /J "%SRC_CONFIG%" "%DEST_CONFIG%"
mklink /J "%SRC_DATA%" "%DEST_DATA%"
echo 符號鏈接創建完成!
echo  原配置目錄 %SRC_CONFIG% 已鏈接到 %DEST_CONFIG%
echo  原鏡像目錄 %SRC_DATA% 已鏈接到 %DEST_DATA%
pause:: 步驟6:恢復備份數據
echo ---------- 步驟6:恢復備份數據 ----------
echo 正在恢復.docker配置...
if exist "%BACKUP_DIR%\.docker" (xcopy "%BACKUP_DIR%\.docker" "%DEST_CONFIG%" /E /Y /I /Q
)echo 正在恢復Docker鏡像數據...
if exist "%BACKUP_DIR%\Docker" (xcopy "%BACKUP_DIR%\Docker" "%DEST_DATA%" /E /Y /I /Q
)
echo 數據恢復完成!
pause:: 完成提示
echo ============= 遷移完成! =============
echo 請重啟電腦后再啟動Docker Desktop,確保符號鏈接生效。
echo =====================================
pause

三、詳細使用教程?

1. 準備工作

  1. 關閉 Docker Desktop:托盤圖標右鍵選擇 "Quit Docker Desktop"
  2. 檢查磁盤空間
    • 目標盤(如 D 盤)需有與原 Docker 數據相當的可用空間
    • 備份盤(如 E 盤)建議預留至少 10GB 空間
  3. 確認 PowerShell 版本
    • 運行$PSVersionTable.PSVersion
    • 最低要求:5.1(Windows 10 內置)

2. 腳本獲取與保存

?

  1. 獲取腳本
    • 復制本文提供的完整腳本
    • 注意完整復制

    • ?
  2. 保存腳本
    • 打開記事本或 VSCode
    • 粘貼腳本后另存為docker_migrate.ps1 或 docker_migrate.bat
    • 保存路徑建議:D:\?或?C:\Users\$USERNAME\Documents 或 桌面
    • 確保文件后綴為.ps1?或 .bat,編碼為UTF-8

?

?

3. 執行腳本步驟

命令行執行
  1. 以管理員身份打開 PowerShell
  2. 切換到腳本目錄:

    cd "D:\保存路徑"  # 例如:cd D:\Users\love\Desktop
    
  3. 執行腳本:

    .\docker_migrate.ps1
    

或雙擊運行 docker_migrate.bat

?

?

4. 執行策略設置(首次使用需操作)

若遇到以下錯誤:

無法加載文件,因為在此系統上禁止運行腳本。

執行以下命令(臨時允許腳本執行):

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass

執行完腳本后可恢復默認策略:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Restricted

?

?

四、遷移過程解析與驗證

1. 腳本執行流程詳解

  1. 環境檢測階段
    • 自動獲取當前用戶名
    • 驗證管理員權限
    • 檢查備份目錄和目標目錄
  2. 數據遷移階段
    • 備份原.docker配置和鏡像數據
    • 創建目標目錄結構
    • 刪除原目錄(保留符號鏈接位置)
    • 創建 Junction 符號鏈接
    • 恢復數據到目標目錄
  3. 完成提示階段
    • 提示重啟電腦使鏈接生效
    • 等待用戶按鍵退出

2. 遷移結果驗證

方法一:圖形界面驗證
  1. 打開文件資源管理器
  2. 導航到C:\Users\$USERNAME\.docker
  3. 右鍵新建一個空白文本文檔
  4. 在目標儲存?D:\DockerData\.docker 中查看是否同步存在該文本文檔
  5. 驗證后刪除該無用文檔
方法二:命令行驗證
  1. 檢查符號鏈接類型:

    Get-Item "C:\Users\$USERNAME\.docker" | Select-Object LinkType
    

    輸出應為:LinkType: Junction
  2. 驗證 Docker 數據路徑:

    docker info | Select-String "Docker Root Dir"
    

    輸出應包含:D:\DockerData\Docker
方法三:Docker Desktop 驗證
  1. 重啟電腦后啟動 Docker Desktop
  2. 點擊菜單 "Settings" → "Resources"
  3. 在 "File Sharing" 選項卡中,確認數據路徑為D:\DockerData\Docker

五、高級技巧與問題解決

1. 自定義路徑方案

  • 場景 1:將數據遷移到移動硬盤
    修改$DEST_BASE為移動硬盤路徑(如E:\DockerStorage
  • 場景 2:按磁盤類型分類存儲
    配置目錄放 SSD:$DEST_DOCKER_CONFIG = "D:\SSD\.docker"
    鏡像數據放 HDD:$DEST_DOCKER_DATA = "E:\HDD\Docker"

2. 常見問題解決方案

問題 1:符號鏈接創建失敗
  • 原因:權限不足或原目錄未刪除
  • 解決
    1. 確認以管理員身份運行
    2. 手動刪除C:\Users\$USERNAME\.docker目錄(確保 Docker 已關閉)
    3. 重新執行腳本
問題 2:Docker 啟動報錯
  • 原因:鏈接未生效或數據損壞
  • 解決
    1. 確認已重啟電腦
    2. 檢查D:\DockerData\.docker\config.json中的data-root字段
    3. 若損壞,可從備份目錄E:\DockerBackup恢復數據
問題 3:備份 / 恢復失敗
  • 原因:磁盤空間不足或路徑錯誤
  • 解決
    1. 清理目標磁盤空間
    2. 確保$BACKUP_DIR$DEST_BASE路徑中沒有中文或特殊字符
    3. 檢查路徑是否存在空格(PowerShell 會自動處理,但批處理需要引號)

3. 腳本擴展建議

  • 添加磁盤空間檢測:在腳本開頭添加磁盤空間檢查功能
  • 增加日志記錄:將操作日志寫入文件,便于問題排查
  • 支持交互式路徑輸入:通過Read-Host命令讓用戶動態輸入路徑
  • 集成 Docker 服務控制:自動停止 / 啟動 Docker 服務,避免手動操作

六、安全與最佳實踐

1. 數據安全措施

  1. 雙重備份機制
    • 腳本自動備份到$BACKUP_DIR
    • 建議手動復制一份到其他存儲設備
  2. 關鍵操作確認
    • 可修改腳本添加Read-Host "確認執行請按Y"之類的確認步驟
  3. 權限最小化
    • 執行完腳本后及時恢復 PowerShell 執行策略為Restricted

2. 性能優化建議

  • 使用硬鏈接替代符號鏈接
    • 對于 Windows 10 1809 + 系統,可嘗試硬鏈接:

      New-Item -ItemType HardLink -Path $SRC_DOCKER_CONFIG -Value $DEST_DOCKER_CONFIG
      
  • 啟用 NTFS 壓縮(非 WSL存儲分區才建議壓縮,WSL 不支持壓縮分區)
    • 對目標目錄啟用 NTFS 壓縮,減少存儲空間占用:

      compact /c /s $DEST_BASE
      

  • 定期清理無用鏡像
    • 遷移完成后執行:

      docker system prune -a -f
      

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86852.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86852.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86852.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring-ai 工作流

目錄 工作流概念工作流程圖spring-boot 編碼定義節點 (Node)定義節點圖StateGraphcontroller測試瀏覽器測試用戶輸入 工作流概念 工作流是以相對固化的模式來人為地拆解任務,將一個大任務拆解為包含多個分支的固化流程。工作流的優勢是確定性強,模型作為…

重頭開始學ROS(6)---Eigen庫安裝與使用

Eigen庫 矩陣運算是一種非常重要的運算方式,在Matlab中,矩陣運算可以輕松的實現,但在C這種偏底層的語言中,若不借助第三方庫,矩陣運算需要我們進行較為復雜的代碼設計。Eigen庫是一個用于線性運算的C模板庫&#xff0…

【STM32】外部中斷

STM32 外部中斷(EXTI)概述 這篇文章結合示例代碼,系統性地講述 STM32 外部中斷(EXTI)實驗的原理、以及配置流程。目的在于輔助讀者掌握STM32F1 外部中斷機制。 STM32F1xx官方資料:《STM32中文參考手冊V10》…

LeetCode Hot100 算法題 (矩陣篇)

1、73. 矩陣置零 給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1: 輸入:matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出:[[1,0,1],[0,0,0],[1,0,1]]// 將第一行…

Flutter基礎(項目創建)

一、使用命令行創建項目 1. 確認 Flutter 環境正常 要保證 Flutter SDK 已經正確安裝,并且環境變量配置無誤。可以通過執行以下命令來驗證: flutter doctor 要保證所有檢查項都顯示綠色對勾,要是有問題,可按照提示進行修復。 …

【Actix Web】Rust Web開發實戰:Actix Web框架全面指南(2025企業級應用版)

? 在2025年高并發、低延遲成為Web服務核心指標的背景下,??Actix Web憑借異步Actor模型與零成本抽象??,成為Rust生態中生產環境部署率最高的Web框架。本指南深入解析Actix Web 4.0核心技術,覆蓋??百萬級并發架構設計??、??內存安全…

HTML之常用基礎標簽

HTML之常用基礎標簽 一、HTML文檔基本結構標簽1. <html>標簽2. <head>標簽3. <body>標簽 二、文本相關基礎標簽1. 標題標簽&#xff08;<h1> - <h6>&#xff09;2. 段落標簽&#xff08;<p>&#xff09;3. 換行標簽&#xff08;<br>…

外鍵列索引優化:加速JOIN查詢的關鍵

在使用數據庫時&#xff0c;特別是在執行涉及JOIN操作的查詢時&#xff0c;優化外鍵列的索引是非常重要的。外鍵通常用于建立表之間的關聯&#xff0c;而JOIN操作則是基于這些外鍵列來實現的。下面是一些關鍵步驟和技巧&#xff0c;可以幫助你優化外鍵列的索引&#xff0c;從而…

2025年 UI 自動化框架使用排行

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 </

【軟考高項論文】論信息系統項目的整體管理

摘要 在信息系統項目的管理中&#xff0c;整體管理處于核心地位&#xff0c;對項目全局規劃與協調起著關鍵作用&#xff0c;保障項目各階段目標一致且高效執行。本文結合作者參與的 2024 年 6 月啟動的信息系統項目&#xff0c;深入探討項目整體管理的過程&#xff0c;著重闡述…

(4)Wireshark捕獲設置

1.簡介 WireShark的強大之處就在于不用你再做任何配置就可以抓取http或者https的包。主要是講解和分享如何使用WireShark抓包。 2.運行Wireshark 安裝好 Wireshark 以后&#xff0c;就可以運行它來捕獲數據包了。方法如下&#xff1a; 1.在 Windows 的“開始”菜單中&#…

智慧校園電子班牌系統源碼的開發與應用,基于Java/SpringBoot后端、Vue2前端、MySQL5.7數據庫

智慧校園系統源碼&#xff0c;智慧班牌源碼&#xff0c;java語言 技術棧&#xff1a; ?后端開發?&#xff1a;采用Java語言和Spring Boot框架進行開發。Java是一種廣泛使用的、面向對象的編程語言&#xff0c;而Spring Boot是基于Spring框架的快速應用開發框架&#xff0c;能…

工程優化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信對比

WebSocket、WSS&#xff08;WebSocket Secure&#xff09;和SSE&#xff08;Server-Sent Events&#xff09;是三種常見的實時通信技術&#xff0c;它們的核心區別在于通信方向、協議實現、數據格式和適用場景。以下是分維度的詳細解釋&#xff0c;并附帶Python示例和應用場景選…

【TiDB 社區智慧合集】 TiDB x 運營商|掌上營業廳、賬務、物聯網等多核心業務場景的實戰應用案例

作者&#xff1a; Billmay表妹 原文來源&#xff1a; https://tidb.net/blog/bb1467af 在信息基礎設施國產化戰略加速落地的背景下&#xff0c;電信及廣電領域正迎來數據庫國產化替代的關鍵轉型期。TiDB 憑借自身技術創新優勢&#xff0c;深度攜手各大運營商&#xff0c;以全…

Java 17 下 Spring Boot 與 Pulsar 隊列集成實戰:生產者與消費者實現指南

Pulsar隊列與Springboot集成有2種模式&#xff1a;官方pulsar-client 或社區Starter&#xff08;如pulsar-spring-boot-starter&#xff09; 如果考慮最新、最快、最齊全的功能&#xff0c;使用官方pulsar-client如果考慮快速低成本接入&#xff0c;使用社區Starter&#xff0…

《Go語言高級編程》RPC 入門

《Go語言高級編程》RPC 入門 一、什么是 RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff0c;遠程過程調用&#xff09;是分布式系統中不同節點間的通信方式&#xff0c;允許程序像調用本地函數一樣調用遠程服務的方法。 Go 語言的標準庫 net/rpc 提供了基礎的…

第N5周:Pytorch文本分類入門

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 一、前期準備 1.加載數據 import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

uniappx 安卓app項目本地打包運行,騰訊地圖報錯:‘鑒權失敗,請檢查你的key‘

根目錄下添加 AndroidManifest.xml 文件&#xff0c; <application><meta-data android:name"TencentMapSDK" android:value"騰訊地圖申請的key" /> </application> manifest.json 文件中添加&#xff1a; "app": {"…

【向上教育】結構化面試開口秘籍.pdf

向 上 教 育 XI A N G S H A N G E D U C A T I O N 結構化 面試 開口秘笈 目 錄 第一章 自我認知類 ........................................................................................................................... 2 第二章 工作關系處理類 .......…

Webpack 熱更新(HMR)原理詳解

&#x1f525; Webpack 熱更新&#xff08;HMR&#xff09;原理詳解 &#x1f4cc; 本文適用于 Vue、React 等使用 Webpack 的項目開發者&#xff0c;適配 Vue CLI / 自定義 Webpack 項目。 &#x1f3af; 一、什么是 HMR&#xff1f; Hot Module Replacement 是 Webpack 提供的…