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

Azure App Service容器中命名卷的实际存储位置在哪里?

解决Azure App Service中Docker命名卷无法访问的问题

核心原因

你在Docker Compose中使用的命名卷由Azure App Service的宿主Docker环境管理,存储在宿主节点的/var/lib/docker/volumes/目录下,但Kudu shell运行在隔离沙箱环境中,没有权限访问宿主节点的这个路径,因此无法直接找到这些卷的文件。

尽管WEBSITES_ENABLE_APP_SERVICE_STORAGE=true能让容器数据在重启后保留,但这仅依赖宿主节点未发生迁移——如果App Service将容器调度到其他节点,命名卷的数据会丢失,这也是你需要可靠备份方案的核心原因。

可行解决方案

方案1:将容器数据复制到Kudu可访问的/home目录

通过将容器内的卷数据复制到App Service的持久化存储目录/home(Kudu可见),实现轻松备份:

  1. 修改docker-compose.yml,给每个服务添加绑定挂载,将容器内的临时备份目录映射到/home下的对应路径:
    version: "3.4"
    services:
      mysqldb:
        image: mysql:5.7
        container_name: mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: kU47k9PpjU5A
          MYSQL_DATABASE: baikal
          MYSQL_USER: baikal
          MYSQL_PASSWORD: PY74bSs72fkT
        volumes:
          - db_data:/var/lib/mysql
          - /home/mysql_backup:/backup  # 新增:绑定挂载到/home/mysql_backup
      baikal:
        image: ckulka/baikal:nginx
        container_name: baikal
        restart: always
        ports:
          - 80:80
        volumes:
          - baikal_specific:/var/www/baikal/Specific
          - baikal_config:/var/www/baikal/config
          - /home/baikal_backup:/baikal_backup  # 新增:绑定挂载到/home/baikal_backup
    volumes:
        db_data:
        baikal_specific:
        baikal_config:
    
  2. 重新部署容器后,通过App Service的容器 > 执行命令功能,分别进入两个容器执行复制命令:
    • 进入MySQL容器:执行 cp -r /var/lib/mysql/* /backup/
    • 进入Baikal容器:执行 cp -r /var/www/baikal/Specific/* /baikal_backup/ 和 cp -r /var/www/baikal/config/* /baikal_backup/
  3. 打开Kudu shell,在/home/mysql_backup和/home/baikal_backup目录下即可看到备份的数据,可直接下载或打包。

方案2:替换命名卷为/home目录的绑定挂载

如果不想手动复制,可直接将命名卷替换为绑定挂载到/home下的子目录,数据直接存储在App Service的持久化存储中,Kudu可直接访问:
修改docker-compose.yml的卷配置:

volumes:
  # 替换命名卷为绑定挂载
  - /home/db_data:/var/lib/mysql
  # Baikal的卷同理:
  - /home/baikal_specific:/var/www/baikal/Specific
  - /home/baikal_config:/var/www/baikal/config

注:如果之前遇到绑定挂载的权限问题,可在容器启动命令中添加权限修复步骤,比如给MySQL服务添加command: --init-file /docker-entrypoint-initdb.d/fix-perms.sh,并挂载包含以下内容的脚本:

#!/bin/bash
chown -R mysql:mysql /var/lib/mysql

方案3:使用Azure CLI导出容器数据

如果你有权限使用Azure CLI,可通过以下步骤导出数据:

  1. 通过SSH进入容器:
    az webapp ssh --name <你的应用名称> --resource-group <你的资源组名称> --container-name mysql
    
  2. 在容器内打包数据:
    tar -czf /backup/mysql_backup.tar.gz /var/lib/mysql
    
  3. 回到本地终端,下载备份文件:
    az webapp deployment source config-zip --resource-group <资源组> --name <应用名称> --src /home/mysql_backup/mysql_backup.tar.gz
    

关键提醒

免费App Service计划的/home目录是持久化存储(配额1GB),使用绑定挂载到/home的方式能确保数据不会因实例迁移丢失,比命名卷更可靠。

内容的提问来源于stack exchange,提问作者Manthan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:26:03