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可见),实现轻松备份:
- 修改
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: - 重新部署容器后,通过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/
- 进入MySQL容器:执行
- 打开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,可通过以下步骤导出数据:
- 通过SSH进入容器:
az webapp ssh --name <你的应用名称> --resource-group <你的资源组名称> --container-name mysql - 在容器内打包数据:
tar -czf /backup/mysql_backup.tar.gz /var/lib/mysql - 回到本地终端,下载备份文件:
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
相关产品推荐
相关产品推荐

