容器跨主机数据迁移同步AI模型文件脚本
容器里训练好的 AI 模型文件通常放在 Docker 数据卷或容器可写层,重建容器或更换服务器时非常容易丢失。
本文用两台 Linux 服务器为例,教你用 docker cp 配合 rsync 写一个可复用的跨主机迁移同步脚本,让 AI 模型文件迁移变得可控、可校验、可定时执行。
适合刚接触 Docker 的零基础运维用户,按步骤操作即可完成。
迁移前需要确认三件事
- 两台服务器能互相访问,建议在内网环境下传输,速度更快。
- 两台服务器都安装 Docker 和 rsync。Ubuntu 执行
apt install docker.io rsync -y,CentOS 执行yum install docker rsync -y。 - 确定模型文件在容器里的实际路径。进入容器查看:
docker exec -it 容器名 sh
ls /app/models
如果想确认容器是否挂载了数据卷,执行:
docker inspect 容器名 --format='{{range .Mounts}}{{.Source}} -> {{.Destination}}{{println}}{{end}}'
如果看到类似 /var/lib/docker/volumes/xxx/_data -> /app/models 的映射,说明模型文件已经持久化在宿主机的数据卷目录;
如果没有映射,文件只在容器可写层,必须先把文件完整复制出来。
把容器里的模型文件完整取出来
以容器名 ai_app 为例,将容器内 /app/models 目录复制到宿主机 /data/models:
docker cp ai_app:/app/models /data/models
如果你的模型文件已经挂载到宿主机的数据卷目录,就可以跳过这一步。
复制完成后记录文件总大小与总数,方便后续比对:
du -sh /data/models
find /data/models -type f | wc -l
注意:不要直接用 * 通配符复制目录内的文件,否则容易漏掉以 . 开头的隐藏文件。
直接复制整个目录最稳妥。
用 rsync 脚本实现跨主机自动同步
rsync 通过 SSH 传输,支持增量同步和断点续传,特别适合动辄几个 GB 的 AI 模型文件。
先配置 SSH 免密登录,避免脚本执行时被卡在密码输入:
ssh-keygen -t rsa -b 4096
ssh-copy-id root@目标服务器IP
然后创建同步脚本 /usr/local/bin/sync_models.sh:
#!/bin/bash
SRC="/data/models"
DEST="root@目标服务器IP:/data/models"
LOG="/var/log/sync_models.log"
rsync -avz --delete --partial --timeout=60 $SRC $DEST >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo "$(date '+%F %T') sync ok" >> $LOG
else
echo "$(date '+%F %T') sync failed" >> $LOG
exit 1
fi
给脚本添加执行权限并手动运行一次:
chmod +x /usr/local/bin/sync_models.sh
/usr/local/bin/sync_models.sh
这里解释几个参数:--delete 会让目标端删除源端不存在的文件,保证两边目录完全一致;--partial 支持传输中断后继续;--timeout=60 避免 SSH 长时间无响应导致脚本卡死。
如果你不确定 --delete 的影响,可以先去掉它,只做增量复制。
添加定时任务让模型文件持续同步
如果训练任务会持续产出新的模型文件,可以把同步脚本加入 crontab,实现自动定时同步。
运行:
crontab -e
添加一行,每小时同步一次:
0 * * * * /usr/local/bin/sync_models.sh
如果希望更频繁,可以改成每 10 分钟一次:
*/10 * * * * /usr/local/bin/sync_models.sh
建议在 crontab 中使用 flock 防止上次任务没跑完、下次任务又启动:
*/10 * * * * /usr/bin/flock -xn /tmp/sync_models.lock -c /usr/local/bin/sync_models.sh
验证迁移结果并避开常见坑
同步完成后,在目标服务器上执行:
du -sh /data/models
find /data/models -type f | wc -l
对比文件总大小和数量是否和源端一致。
如果一致,基本可以确认迁移成功。
需要更严谨的话,对关键模型文件执行 MD5 校验:
md5sum 模型文件名
几个容易踩的坑:
- 模型文件只存在容器可写层:容器删除后数据就没了,必须提前用
docker cp备份到宿主机,或者直接挂载数据卷。 - rsync 源路径末尾是否加
/:rsync -avz /data/models /data/和/data/models/ /data/的行为不同,前者会在目标端生成models子目录,后者直接把内容铺到目标目录,建议先小范围测试。 - 隐藏文件被漏掉:用通配符复制目录内容时会漏掉
.env、.git这类文件,直接复制整个目录可以避免。 - 同步任务重叠:大模型文件传输时间超过定时间隔时,多个 rsync 进程会互相争抢资源,用
flock加锁解决。
如果你正在处理容器跨主机数据迁移同步 AI 模型文件脚本,建议先按本文步骤完整执行,再根据自己的目录结构和网络环境做微调。
遇到异常时优先回看上面的避坑说明,同时可以进一步了解 Docker 数据卷持久化配置,从根源上降低模型文件丢失风险。