docker 无法从 wwwroot 中找到文件
docker could not find a file from wwwroot
这是我第一次尝试在我的 asp.net 核心 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 中的文件时,我得到的错误是:
An unhandled exception has occurred while executing the request.
System.IO.FileNotFoundException: Could not find file
'/app/wwwroot\Db\product.json'. File name:
'/app/wwwroot\Db\product.json'
我是否应该在 docker 文件中包含任何特殊内容以复制 wwwroot 文件夹,或者我是否需要根据 docker 图像中的路径添加文件路径?
您似乎正在使用 Linux 容器并使用 Windows 文件路径约定。 Path.Combine 确实支持这个,但它需要一些帮助。
/app/wwwroot\Db\product.json
尝试wwwroot/Db/product.json
如果这是您的问题,您可能希望检查 Path.Combine 的重载
因为 Combine 方法有接受额外参数的额外重载
- public 静态字符串组合(字符串路径 1、字符串路径 2、字符串路径 3)
- public static string Combine(string path1, string path2, string path3, string path4)
- public 静态字符串组合(参数字符串[] 路径)
您的代码:
Path.Combine(_env.ContentRootPath, @"wwwroot\Db\product.json");
然后会变成这样:
Path.Combine(basePath, "wwwroot", "Db", "product.json");
这是我第一次尝试在我的 asp.net 核心 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 中的文件时,我得到的错误是:
An unhandled exception has occurred while executing the request.
System.IO.FileNotFoundException: Could not find file '/app/wwwroot\Db\product.json'. File name: '/app/wwwroot\Db\product.json'
我是否应该在 docker 文件中包含任何特殊内容以复制 wwwroot 文件夹,或者我是否需要根据 docker 图像中的路径添加文件路径?
您似乎正在使用 Linux 容器并使用 Windows 文件路径约定。 Path.Combine 确实支持这个,但它需要一些帮助。
/app/wwwroot\Db\product.json
尝试wwwroot/Db/product.json
如果这是您的问题,您可能希望检查 Path.Combine 的重载 因为 Combine 方法有接受额外参数的额外重载
- public 静态字符串组合(字符串路径 1、字符串路径 2、字符串路径 3)
- public static string Combine(string path1, string path2, string path3, string path4)
- public 静态字符串组合(参数字符串[] 路径)
您的代码: Path.Combine(_env.ContentRootPath, @"wwwroot\Db\product.json");
然后会变成这样: Path.Combine(basePath, "wwwroot", "Db", "product.json");