我正在部署一个.NET Core 3.1控制台应用程序作为应用程序包,以通过Azure的批处理服务执行作业。
当我尝试执行作业时,执行失败并显示以下错误:
Unhandled exception. System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is '/mnt/batch/tasks/workitems/FeedUpdates_Prod/job-1/FeedUpdate-20200107_1/wd/appsettings.json'.
at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info)
at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()
at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at App.jobs.Program.Main(String[] args) in C:Developmentappappapp.jobsProgram.cs:line 24
Aborted (core dumped)
这是我设置主机并指示它使用 json 文件的代码(请注意,无论配置如何,它都会收到相同的错误。SetBasePath 行是否被调用(。
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile(
"appsettings.json", optional: false, reloadOnChange: false);
config.AddCommandLine(args);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
appsettings.json 文件包含在我上传的应用程序包中,但不存在于它正在查找的目录中('/mnt/batch/tasks/workitems/FeedUpdates_Prod/job-1/FeedUpdate-20200107_1/wd/appsettings.json'(,因此消息是准确的,但我不清楚为什么它会在该特定文件夹中查找或如何告诉它在应用程序的文件夹中查找。
这是为触发作业而执行的命令:
/bin/sh -c $AZ_BATCH_APP_PACKAGE_app_jobs"/app.Jobs -jFeedUpdate"
文件列表显示应用程序设置.json
我建议通读本文档:https://learn.microsoft.com/en-us/azure/batch/batch-application-packages
envinroment var access
我认为这是您正在查看的错误位置,请参阅以下内容:https://learn.microsoft.com/en-us/azure/batch/batch-application-packages#execute-the-installed-applications
物理位置的想法:您可以远程访问节点或使用Batch-explorer 等工具查看正确的目录级别在哪里,但如果我没记错的话,任务级别应用程序包通常驻留在:/mnt/batch/tasks/applications/
文件夹级别(我认为(。
堆栈跟踪显示代码尝试从中加载配置文件的目录:
Unhandled exception.
System.IO.FileNotFoundException:
The configuration file 'appsettings.json' was not found and is not optional.
The physical path is '/mnt/batch/tasks/workitems/FeedUpdates_Prod/job-1/FeedUpdate-20200107_1/wd/appsettings.json'.
此文件夹是任务工作目录。
应用程序包不会下载到任务工作目录中,因为它们可以由多个任务使用 - 这就是命令行需要使用环境变量$AZ_BATCH_APP_PACKAGE_app_jobs
的原因。
在您的代码片段中,您有以下行:
config.SetBasePath(Directory.GetCurrentDirectory());
这是将当前目录设置为从中加载配置文件的位置。
相反,您希望从控制台应用程序本身的部署位置加载配置文件。
我不熟悉 Core ASP.NET 处理配置的方式,但我希望您需要在hostingContext
上可用的目录。
修改对config.SetBasePath()
的调用以传递包含应用程序的目录;然后,您应该能够加载配置文件。
我能够通过将应用程序设置作为资源添加到任务中来解决此问题,然后将其带入工作目录。
这并不理想,我不明白为什么它可以找到可执行文件和支持文件,但找不到位于同一应用程序包中的应用程序设置,所以如果有人对此有答案,我想知道。