迁移Dockers版的cloudrever

Cloudreve 容器迁移操作的完整总结

  • 临时停止容器确保数据一致性

  • 迁移镜像和挂载数据的完整步骤

  • 修复 400 Client Error: Bad Request ("no command specified") 错误的方法


✅ Cloudreve Docker 容器迁移总结指南


🛑 一、临时停止容器确保数据一致性

迁移前必须停止容器,防止数据在迁移中被写入,避免数据丢失或损坏。

docker stop cloudreve

📦 二、打包镜像和数据

1. 导出当前容器为镜像

docker commit cloudreve cloudreve_migrated
docker save -o cloudreve_migrated.tar cloudreve_migrated

commit 生成了一个包含当前运行状态的镜像,save 将它打包为 tar 文件


2. 打包挂载的数据目录

根据你实际配置,Cloudreve 持久化数据挂载在:

/data/cloudreve/uploads

打包这个目录:

tar czvf cloudreve_uploads.tar.gz -C /data/cloudreve/uploads .

🚚 三、传输文件到目标服务器

使用 scp 将镜像与数据打包文件复制到新服务器:

scp cloudreve_migrated.tar cloudreve_uploads.tar.gz user@目标服务器IP:~

🛠 四、在目标服务器上还原镜像和数据

1. 加载镜像

docker load -i cloudreve_migrated.tar

可选:为镜像重命名为 cloudreve,更简洁:

docker tag cloudreve_migrated cloudreve

2. 解压数据目录

mkdir -p /data/cloudreve/uploads
tar xzvf cloudreve_uploads.tar.gz -C /data/cloudreve/uploads

🚀 五、运行新容器(不对外暴露端口)

启动容器

docker run -d \
--name cloudreve \
-p 4777:80 \
-v /data/cloudreve/uploads:/cloudreve/uploads \
cloudreve_migrated ./cloudreve

✅ 说明:

  • 不使用 -p 参数,所以外网不能直接访问

  • ./cloudreve -p 4777 是关键,指定程序监听容器内 4777 端口

  • 容器内部或反向代理可以访问该端口


❗ 错误解决:400 Client Error: Bad Request ("no command specified")

产生原因:

你使用了 docker commit 创建镜像,但 没有保留原容器的启动命令(CMD),导致运行镜像时报错:

400 Client Error: Bad Request ("no command specified")

解决方法 ✅:

方法 1:在 docker run 时手动指定启动命令

docker run -d \
  --name cloudreve \
  -v /data/cloudreve/uploads:/cloudreve/uploads \
  cloudreve \
  ./cloudreve -p 4777

方法 2:重新 commit 镜像时指定 CMD(更好)

docker commit --change='CMD ["./cloudreve", "-p", "4777"]' cloudreve cloudreve_migrated

然后再 docker savedocker loaddocker run 时就不必再指定命令了。


✅ 附加建议

项目 是否已做 建议
临时停止容器确保一致性 非常必要
导出镜像和挂载数据 完整
避免使用 -p 映射端口 提高安全性
启动命令遗漏修复 通过 CMD 或参数传入
使用反向代理(如 Nginx)访问 🔧 可选 更适合公网访问

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享