Docker容器内运行func发布命令报错:无法找到Local Application Data
问题描述
开发原型项目时,在基于ubuntu:20.04的Docker镜像中安装了Azure CLI和Azure Functions Core Tools,但运行部署命令时触发错误:
System.Exception: Cannot find the Local Application Data.
at Azure.Functions.Cli.Utilities.EnsureCoreToolsLocalData() in D:\a_work\1\s\src\Azure.Functions.Cli\Common\Utilities.cs:line 180
at Azure.Functions.Cli.Telemetry.PersistenceChannel.StorageService.VerifyOrSetDefaultStorageDirectoryPath(String desireStorageDirectoryPath) in D:\a_work\1\s\src\Azure.Functions.Cli\Telemetry\PersistenceChannel\StorageService.cs:line 96
at Azure.Functions.Cli.Telemetry.PersistenceChannel.StorageService.Init(String storageDirectoryPath) in D:\a_work\1\s\src\Azure.Functions.Cli\Telemetry\PersistenceChannel\StorageService.cs:line 76
at Azure.Functions.Cli.Telemetry.PersistenceChannel.PersistenceChannel..ctor(String storageDirectoryPath, Int32 sendersCount) in D:\a_work\1\s\src\Azure.Functions.Cli\Telemetry\PersistenceChannel\PersistenceChannel.cs:line 41
at Azure.Functions.Cli.Telemetry.Telemetry.InitializeTelemetry() in D:\a_work\1\s\src\Azure.Functions.Cli\Telemetry\Telemetry.cs:line 93
已排除架构问题,在Mac、Windows、Azure环境的amd64/x86_64架构下测试均出现相同错误。
解决方案
错误源于Core Tools初始化遥测时无法找到用于存储数据的本地目录,可通过以下三种方式解决:
1. 配置本地数据目录环境变量
在Linux容器中,Core Tools默认读取XDG_DATA_HOME环境变量指向的目录(无此变量时默认~/.local/share),需确保该目录存在且可写:
- 在Dockerfile中添加配置:
# 针对root用户创建目录并设置环境变量 RUN mkdir -p /root/.local/share/AzureFunctionsTools ENV XDG_DATA_HOME=/root/.local/share - 或运行容器时临时指定:
docker run -e XDG_DATA_HOME=/root/.local/share your-image-name func deploy [你的部署参数]
2. 禁用Core Tools遥测
直接跳过遥测初始化流程,避免目录检查:
- 在Dockerfile中添加环境变量:
ENV FUNCTIONS_CORE_TOOLS_TELEMETRY_OPTOUT=1 - 或执行部署命令前临时设置:
export FUNCTIONS_CORE_TOOLS_TELEMETRY_OPTOUT=1 && func deploy [你的部署参数]
3. 配置非root用户的正确环境
若使用非root用户运行容器,需确保用户拥有HOME目录及对应权限:
# 创建带HOME目录的用户 RUN useradd -m appuser # 切换到该用户 USER appuser # 创建Core Tools所需目录 RUN mkdir -p ~/.local/share/AzureFunctionsTools # 设置环境变量 ENV XDG_DATA_HOME=/home/appuser/.local/share
验证
完成配置后,可先执行func --version测试Core Tools是否能正常启动,再运行部署命令即可。
内容的提问来源于stack exchange,提问作者Manuel Da Silva

