You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:48:17