运维脚本

docker-data-move.sh

来自 tool-tl/docker-data-move.sh 项目,并通过 helper.sh 重新分发,方便直接执行、运维交接和多语言文档说明。

生成 Docker 迁移命令方案

一键命令

curl -fL 'https://www.helper.sh/docker-data-move.sh' -o './docker-data-move.sh'

此命令只下载本站文件,不会执行。请先检查保存的源码并核对版本,再决定是否运行。

核对已下载文件

与本页面构建时内置的确切字节比较。文件只在当前标签页处理,此工具不上传、不持久化文件。上限 2 MiB。

预期 SHA-256
5b35b743ee0609c61f6eca3666a3facb7d35b6e9742a52e5cfcf8ecefdff75e8

内置文件字节数: 12676

保存校验文件

将脚本和校验文件保存在同一目录。Linux 安装 GNU Coreutils 后可用下方命令只检查字节,不运行脚本;使用此命令时需保留原文件名。

sha256sum --check './docker-data-move.sh.sha256'

尚未比较。

校验值与脚本来自同一网站,不是独立签名。一致不证明安全、上游依赖真实可信或适合本机;可变远程依赖需单独审阅。

查看验证与限制

运行要求

  • Linux 主机
  • 已安装 Docker
  • 已安装 rsync
  • 需要 root 权限
  • 可选安装 jq 以更安全地修改 JSON

适用场景

  • 把 Docker 从已满的根分区或 home 分区迁到更大的挂载点
  • 标准化磁盘告急主机的恢复流程
  • 降低修改 Docker daemon.json 时的人工失误

脚本亮点

  • 自动识别当前 Docker Root Dir
  • 扫描本机磁盘并按剩余空间推荐迁移目标
  • 切换前自动备份旧 Docker 数据目录和 daemon 配置

推荐流程

  1. 检查当前 Docker data-root,并估算迁移所需空间。
  2. 通过交互选择目标路径,或使用 --auto 自动挑选。
  3. 停止 Docker 服务,使用 rsync 迁移数据,更新 daemon.json 并重启 Docker。
  4. 验证新的 Docker Root Dir,并确认容器运行正常。

安全提示

  • 在生产主机执行前先审阅脚本内容。
  • 对磁盘布局不熟时优先使用交互模式。
  • 只有确认备份和目标容量都没问题后再加 --yes。

兼容范围与限制

  • 需要 Linux、Docker、df、du、rsync 和 root 权限;jq 可选。
  • Docker Engine 29+ 全新安装若使用 containerd image store,镜像内容与快照可能位于 /var/lib/containerd;此脚本只迁移 Docker Root Dir。
  • 没有 dry-run 或自动回滚。未安装 jq 时,现有 daemon.json 会被替换成只含 data-root 的对象。目标目录会先创建并 chown 为 root:root,再检查是否为空;即使后续拒绝,也可能已改变目录所有者。

受影响的文件、服务和数据

  • /etc/docker/daemon.json(或 CONFIG_FILE):设置 data-root;现有文件会备份,但无 jq 时会被替换。
  • 停止存在的 docker/containerd 服务,rsync Docker Root Dir,将旧目录改名为带时间戳的 .bak,再启动服务。
  • 先创建目标目录并设为 root:root,然后检查是否为空;ALLOW_NONEMPTY=1 会跳过这项检查。

只读核验

  • 确认 `docker info --format '{{.DockerRootDir}}'` 等于所选目标路径。
  • 检查 `systemctl status docker containerd`、`docker ps -a` 及代表性卷和镜像。
  • 等业务方确认数据无误后再处理旧 .bak 目录;脚本不会自动恢复。

失败后的下一步

目标被拒绝时,检查目录内容和所有者,因为 mkdir/chown 在拒绝前已执行。Docker 服务停止后若发生错误,脚本没有清理 trap,服务可能保持停止。检查新旧数据路径、daemon.json 和 `sudo journalctl -u docker -u containerd -n 100 --no-pager`,保留备份并手动制定恢复方案;不要删除或盲目重跑。

先下载、审阅并核对版本,再决定是否执行。哈希只能标识这一版字节,不能证明安全。pipe 命令会立即执行远程内容;上游依赖也可能变化。

生成 Docker 迁移命令方案

填写你已自行核对的路径。此工具不会探测主机或执行命令;除非主动复制或下载方案,输入只留在当前标签页。保存的方案可能包含私有路径。

已审阅范围:Linux/systemd 本机的 rootful Docker Engine、默认 docker 服务及 /etc/docker/daemon.json。Docker Desktop、rootless Docker、远程 Docker context、自定义服务或配置路径不在此构建器范围内。维护前先核对 Docker context 和环境变量覆盖。

填写路径前先确认迁移范围

这是你的声明,不是主机测量结果。未知或范围外的选择不会生成运行命令或 JSON 方案;更改声明会使已有方案失效。

如何只读核对而不改配置

仅对已授权的目标主机/守护进程运行这些只读查询,私有端点和服务配置留在本地。仅凭 context 名称不能证明守护进程在本机。

docker context ls
printenv DOCKER_HOST DOCKER_CONTEXT
docker info --format '{{json .SecurityOptions}}'
docker info --format '{{json .DriverStatus}}'
systemctl cat docker

DriverStatus 含 io.containerd.snapshotter.v1 表示使用 containerd image store,应停止此流程。Engine 29+ 全新安装默认使用它,升级安装可能不同;不要仅凭版本或 Docker Root Dir 判断。不确定时保留“尚未核实”,不要为通过检查而切换后端。

Docker containerd image store

先在目标 Linux 主机上只读查看实际 Docker Root Dir:

docker info --format '{{.DockerRootDir}}'

使用不超过 1,024 个字符的 Linux 绝对路径;不接受尾随或重复斜杠、. 或 .. 段、反斜杠及首尾空白。空格和 Shell 标点会按字面值引用。

仅检查了路径格式和脚本的字符串前缀限制。符号链接、实际 Docker 根目录、挂载、文件系统能力、目标是否为空、所有者、空间、权限和备份均未验证。脚本运行时会自行检测 Docker 根目录;这里填写的当前路径不会覆盖检测结果。

源码与限制: 查看本站脚本 · Docker 数据目录文档

查看范围检查与验证限制

在本地检查迁移日志片段

相关专题

CentOS 7:选择恢复任务

变更已结束支持的主机前,先区分仓库故障、SSH 访问问题和 Docker 存储压力。

查看专题