docker无法从wwwroot找到文件

oipij1gg  于 2023-03-17  发布在  Docker
关注(0)|答案(2)|浏览(158)

这是我第一次尝试在asp.netcore 5.0应用程序中运行docker映像,我在docker文件中添加了以下配置。

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["Shopping.Client/Shopping.Client.csproj", "Shopping.Client/"]
RUN dotnet restore "Shopping.Client/Shopping.Client.csproj"
COPY . .
WORKDIR "/src/Shopping.Client"
RUN dotnet build "Shopping.Client.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Shopping.Client.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Shopping.Client.dll"]

我正在尝试使用以下代码访问wwwroot文件夹中的文件:

private async Task<T> ReadAsync<T>(string filePath)
{

    using FileStream stream = File.OpenRead(filePath);
    return await JsonSerializer.DeserializeAsync<T>(stream);
}

public async Task<List<Product>> GetProducts()
{
    var filePath = System.IO.Path.Combine(_env.ContentRootPath, @"wwwroot\Db\product.json");
    return await ReadAsync<List<Product>>(filePath);
}

当我运行应用程序并尝试访问wwwroot中的文件时,我得到的错误为:
执行请求时发生未处理的异常。
System.IO.FileNotFoundException:无法找到文件“/”。文件名:“/应用程序/wwwroot\数据库\产品. json”
我是否应该在docker文件中包含任何特殊内容以复制wwwroot文件夹,或者我是否需要根据docker映像中的路径添加文件路径?

kpbwa7wx

kpbwa7wx1#

看起来您正在使用Linux容器和Windows文件路径约定。Path.合并确实支持这一点,但它需要一些帮助。
/app/wwwroot\Db\product.json
请访问wwwroot/数据库/产品. json
如果这是您的问题,您可能希望检查Path.合并的重载,因为Combine方法具有接受附加参数的附加重载
1.公共静态字符串合并(字符串路径1、字符串路径2、字符串路径3)
1.公共静态字符串合并(字符串路径1、字符串路径2、字符串路径3、字符串路径4)
1.公共静态字符合并(参数string[]路径)

**您的代码:**路径.合并(_env.内容根路径,@“wwwroot\Db\product.json”);
**将变成类似于:**路径.合并(basePath,“wwwroot”,“Db”,“product.json”);

0x6upsns

0x6upsns2#

请通过Try..Catch块进行尝试。例如:

public async Task<List<Product>> GetProducts()
{
  try 
  {
      var filePath ="wwwroot//Db//product.json";
    return await ReadAsync<List<Product>>(filePath);
  }
  catch (Exception e)
  {
    //  Block of code to handle errors
  return List<Product>();
  }

}

对于运行容器,可以使用以下命令
使用卷在:您可以在以下路径中看到卷列表:(在窗口上)
\wsl.本地主机\停靠器桌面数据\数据\停靠器\卷

> docker run -v volumeName:/app/wwwroot/Db -p 7778:80 imagename

或者,您可以使用装载路径:(不推荐),例如,您希望保存在c:\Db中

> docker run -v c:/db:/app/wwwroot/Db -p 7778:80 imagename

相关问题