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 save、docker load 和 docker run 时就不必再指定命令了。
✅ 附加建议
| 项目 | 是否已做 | 建议 |
|---|---|---|
| 临时停止容器确保一致性 | ✅ | 非常必要 |
| 导出镜像和挂载数据 | ✅ | 完整 |
避免使用 -p 映射端口 |
✅ | 提高安全性 |
| 启动命令遗漏修复 | ✅ | 通过 CMD 或参数传入 |
| 使用反向代理(如 Nginx)访问 | 🔧 可选 | 更适合公网访问 |
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
