Docker备份卷恢复失败排查:Nginx Proxy Manager场景
Nginx Proxy Manager Docker卷恢复失败问题分析
问题背景
更换家用小型服务器后,尝试恢复通过Docker Compose部署的Nginx Proxy Manager(NPM)服务,已完成卷备份但恢复失败。当前使用的docker-compose.yaml配置如下:
version: "3.6" services: app: image: jc21/nginx-proxy-manager:latest restart: always ports: - "80:80" - "443:443" - "81:81" environment: DB_MYSQL_HOST: "db" DB_MYSQL_PORT: 3306 DB_MYSQL_NAME: "db_name" DB_MYSQL_USER: "db_user" DB_MYSQL_PASSWORD: "db_password" volumes: - data:/data - ./letsencrypt:/etc/letsencrypt depends_on: - db db: image: jc21/mariadb-aria:latest restart: always environment: MYSQL_DATABASE: "db_name" MYSQL_ROOT_PASSWORD: "root_password" MYSQL_USER: "db_user" MYSQL_PASSWORD: "db_password" volumes: - db:/var/lib/mysql volumes: db: data:
执行docker compose up -d启动栈后,使用以下命令恢复备份失败:
docker run --rm --volumes-from nginx-proxy-manager-db-1 -v $(pwd):/backup ubuntu bash -c "cd / && tar xvf /backup/nginx-proxy-manager_db_20220717-082200.tar --strip 1"docker run --rm --volumes-from nginx-proxy-manager-app-1 -v $(pwd):/backup ubuntu bash -c "cd / && tar xvf /backup/nginx-proxy-manager_data_20220717-082200.tar --strip 1"
问题根源及解决方法
1. 容器名称不匹配
Docker Compose的容器命名规则是[项目目录名]-[服务名]-[序号],如果新服务器上的项目目录名和旧服务器不一致,容器名就不会是nginx-proxy-manager-db-1或nginx-proxy-manager-app-1。
解决:执行docker ps -a查看实际容器名称,替换恢复命令中的容器名。
2. 恢复时机错误
启动服务后再恢复备份,Mariadb容器会自动初始化新的空数据库,直接覆盖你恢复的备份内容。
解决:
- 先创建卷但不启动服务:
docker compose up -d --no-start - 完成备份恢复后,再启动服务:
docker compose up -d
3. 解压路径与参数不匹配
你的恢复命令是在根目录/下解压并使用--strip 1,但需要和备份时的打包路径匹配:
- 如果备份命令是
tar cvf /backup/xxx.tar /var/lib/mysql(打包整个目录),--strip 1是正确的; - 如果备份时是进入目录打包:
cd /var/lib/mysql && tar cvf /backup/xxx.tar .,则不需要--strip 1,否则文件会被解压到根目录而非卷的对应路径。
解决:根据备份方式调整解压路径和参数,比如针对DB卷,应该进入/var/lib/mysql目录再解压:
docker run --rm --volumes-from [实际DB容器名] -v $(pwd):/backup ubuntu bash -c "cd /var/lib/mysql && tar xvf /backup/nginx-proxy-manager_db_20220717-082200.tar --strip 1"
4. 文件权限错误
用ubuntu容器解压的文件权限为root,而Mariadb容器以mysql用户(通常UID/GID为999)运行,会导致数据库无法读取文件。
解决:解压后添加权限调整命令:
# 恢复DB卷并修正权限 docker run --rm --volumes-from [实际DB容器名] -v $(pwd):/backup ubuntu bash -c "cd /var/lib/mysql && tar xvf /backup/nginx-proxy-manager_db_20220717-082200.tar --strip 1 && chown -R mysql:mysql /var/lib/mysql" # 恢复data卷并修正权限 docker run --rm --volumes-from [实际APP容器名] -v $(pwd):/backup ubuntu bash -c "cd /data && tar xvf /backup/nginx-proxy-manager_data_20220717-082200.tar --strip 1 && chown -R root:root /data"
内容的提问来源于stack exchange,提问作者icolumbro
相关产品推荐
相关产品推荐

