从 dockerized 解决方案中的项目根目录访问文件

access to file from the project root inside dockerized solution

Docker 文件

FROM public.ecr.aws/lambda/dotnet:6 AS base
FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim as build
WORKDIR /src
COPY ["AWSServerless.csproj", "AWSServerless/"]
RUN dotnet restore "AWSServerless/AWSServerless.csproj"

WORKDIR "/src/AWSServerless"
COPY . .
RUN dotnet build "AWSServerless.csproj" --configuration Release --output /app/build

FROM build AS publish   
RUN dotnet publish "AWSServerless.csproj" \
            --configuration Release \ 
            --runtime linux-x64 \
            --self-contained false \ 
            --output /app/publish \
            -p:PublishReadyToRun=true  

FROM base AS final
WORKDIR /var/task

CMD ["AWSServerless::AWSServerless.LambdaEntryPoint::FunctionHandlerAsync"]
COPY --from=publish /app/publish .

项目源结构

AWSServerless
   Controllers
      ValuesController.cs
   appsettings.json
   Dockerfile
   Startup.cs
   MyFile.mp4

我正在尝试从控制器访问此 MyFile.mp4 文件

var image = Image.FromFile("/var/task/MyFile.mp4"); 

但我得到了

System.IO.FileNotFoundException: /var/task/MyFile.mp4

我试过其他路径

var image = Image.FromFile("/src/MyFile.mp4"); 
var image = Image.FromFile("/src/AWSServerless/MyFile.mp4"); 

None 本作品 (System.IO.FileNotFoundException)。 我在这里做错了什么?

我有同样的问题,这是因为这个文件是外部的,不包含在发布过程中,所以从我的情况来看,你可以通过连接到[=29=来检查发布后是否有这个文件] 命令: docker container exec -it container_Your_name ls /var/task

如果没有这个文件,问题出在你的发布命令上。

我想您需要在发布中包含外部文件,例如:

在文件的属性中,您可以将 Copy to output directory 设置为 Copy always 或者您可以编辑解决方案文件,展开所需文件的 xml 标签并添加 <CopyToOutputDirectory>Always</CopyToOutputDirectory> 作为 sub-tag.

或者您可以在 XML:

中手动完成
<ItemGroup>
    <Content Include="AppData\**" CopyToPublishDirectory="PreserveNewest"/>
  </ItemGroup>

对我有帮助,否则你可以试试这个方法: