首页 > 解决方案 > 在 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"]

异常屏幕如下所示:

在此处输入图像描述

标签: c#dockerasp.net-core

解决方案


您提到调试模式与发布模式,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并检查输出来检查,然后根据需要包含文件。


推荐阅读