【问题标题】:FileNotFound Exception when run on docker在 docker 上运行时出现 FileNotFound 异常
【发布时间】:2021-10-24 01:10:43
【问题描述】:

我有一个 ASP.Net Core Web API 应用程序,我在其中访问一个文件,该文件位于与“Controllers”文件夹相同级别的“Data”文件夹中。当我在没有 docker 的情况下运行应用程序时,它工作得非常好。但是当我在 docker 上运行应用程序时,它只会抛出一个错误。

docker logs <containerid> 的帮助下检查日志后,我发现了以下内容:

Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HMB6BABGSIF7", Request id "0HMB6BABGSIF7:00000001": An unhandled exception was thrown by the application.
System.IO.FileNotFoundException: Could not find file '/app/.\Data\petronas.xlsx'.
File name: '/app/.\Data\petronas.xlsx'
   at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)

以下是我的 Docker 文件:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY ./ ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/sdk:3.1
WORKDIR /app
COPY --from=build-env /app/out .
COPY Data ./Data
ENV ASPNETCORE_URLS=http://+:5000  
ENTRYPOINT ["dotnet", "Validator.dll"]

访问文件的代码:

var lineitems = ConvertExcelToDataTable(@".\Data\petronas.xlsx");

【问题讨论】:

  • 你是如何访问你的文件代码的?
  • @aamd 我已经添加了代码。
  • 似乎您在 Windows 上的开发和 \Data\petronas.xlsx 需要在容器上更改为 /Data/petronas.xlsx...我现在不记得 dotnet 容器是基于什么的,但是,如果我没记错的话,它是Linux。此外,当您离开中间容器时,您可以使用mcr.microsoft.com/dotnet/aspnet:3.1 映像而不是 sdk...它针对运行 aspnet 核心应用程序进行了优化,并且应该更小。

标签: c# docker asp.net-core dockerfile


【解决方案1】:

在 linux 路径分隔符是 / 你可以将你的 filePath 更改为 ./Data/pertonas.xlsx 它可以在 linux 和 windwos 上工作。请注意路径在 Linux 中区分大小写

【讨论】:

  • 不要为某个平台或其他平台硬编码,而是使用 Path.JoinPath.Combine 之类的东西让 .NET 担心平台的细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2012-06-28
相关资源
最近更新 更多