c# - 在 Docker 容器中访问 .NET Core 项目中的 CSV 文件
问题描述
我在 Docker 容器 (Linux) 中的 .NET Core 项目中访问 CSV 文件时遇到问题,它在调试模式下工作正常,但在发布模式下无法正常工作(错误提示找不到文件)。有什么想法可能是错的吗?该项目有一个名为“Data”的文件夹,其中包含 CSV 文件。
[Route("GetTestFile")]
[HttpGet]
public IActionResult GetTestFile()
{
var fileName = "testdata.csv";
var filePath = Path.Combine("Data", fileName);
return new FileContentResult(File.ReadAllBytes(filePath), "text/csv") { FileDownloadName = fileName };
}
Dockerfile
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY PVT_Matching_Algorithm/PVT_Matching_Algorithm.csproj PVT_Matching_Algorithm/
RUN dotnet restore PVT_Matching_Algorithm/PVT_Matching_Algorithm.csproj
COPY . .
WORKDIR /src/PVT_Matching_Algorithm
RUN dotnet build PVT_Matching_Algorithm.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish PVT_Matching_Algorithm.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "PVT_Matching_Algorithm.dll"]
异常屏幕如下所示:
解决方案
您提到调试模式与发布模式,Dockerfile中的相关行是:
RUN dotnet build PVT_Matching_Algorithm.csproj -c Release -o /app
RUN dotnet publish PVT_Matching_Algorithm.csproj -c Release -o /app
异常画面说找不到目录,即/app/Data
发布应用程序时,dotnet 仅将所需的运行时文件复制到发布目录(而不是源代码等)
多阶段 Dockerfile 的第一部分将所有源代码复制到 workdir /src,构建它们,然后发布到 /app。它使用带有所有构建工具的 aspnetcore-build 映像。
多阶段 Dockerfile 的最后一部分仅复制已发布的文件,并使用 aspnetcore 运行时映像,因此只有运行时文件。
如果在您进行发布构建时该文件丢失,但在您进行调试构建时没有,那么它可能被配置为有条件地包含/发布。
dotnet publish
要对此进行测试,请在本地运行命令并进行比较:
dotnet publish PVT_Matching_Algorithm.csproj -c Debug -o publish-Debug
dotnet publish PVT_Matching_Algorithm.csproj -c Release -o publish-Release
如果丢失,请检查您的 .csproj 文件,可能存在仅在调试模式下包含该文件的条件;删除条件,使其包含在两种构建类型中,并在本地测试。
注意:不是 Debug vs Release 配置,可能是“调试”实际上意味着访问其他容器之一,例如“构建”容器,以进行调试。在这种情况下,dotnet build
可能已经复制了不包含在dotnet publish
(甚至直接使用 /src 目录)中的文件——这可以通过本地运行dotnet publish
并检查输出来检查,然后根据需要包含文件。
推荐阅读
- javascript - React 从子组件访问变量
- angular - 为什么带有嵌入式应用程序的角度应用程序会引发错误运行时编译器未在 AOT 模式下加载?
- cordova - 有没有办法扩展科尔多瓦插件?
- c - 使用未初始化的静态数组时一直出错
- zabbix - 设置两个电子邮件通知之间的时间间隔
- azure-eventhub - 流分析 - 处理没有数组名称的 JSON
- c++ - std::optional 如何永远不会“异常无价值”?
- c++ - 如何在arduino中将十六进制UTF-16字符转换为字符串
- c++ - 为什么我不能删除下面的指针?
- javascript - pm2 cron 在启动时自动运行