Docker镜像构建后容器缺失Assets文件夹问题求助
问题:容器中缺失src根目录的Assets文件夹
感谢@ziyang-liu-msft的帮助,我已成功将镜像部署至Azure镜像仓库。现在发现拉取镜像并启动容器后,src根目录下的Assets文件夹(包含Fonts子文件夹及字体文件)缺失,其他所需文件夹均存在于镜像中。已通过命令docker run -it --entrypoint sh imagename进入容器确认该文件夹确实缺失。
我的Dockerfile内容如下:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 # This stage is used to build the service project FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG BUILD_CONFIGURATION=Release ARG ACCESSTOKEN WORKDIR /src COPY . . RUN dotnet restore "./appfolder/app.csproj" --configfile "./appname/nuget.config" WORKDIR "/src/appfolder" RUN dotnet build "./app.csproj" -c $BUILD_CONFIGURATION -o /app/build --no-restore # This stage is used to publish the service project to be copied to the final stage FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./app.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false --no-restore # This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration) FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "app.dll"]
请问我究竟遗漏了什么配置?
解决方案
核心原因:Assets文件夹没有被
dotnet publish纳入发布输出目录。.NET项目默认只会打包被项目引用、或是在项目文件中配置了「复制到输出目录」属性的文件。方案一:修改项目配置文件(推荐)
打开你的app.csproj文件,添加以下配置,确保Assets文件夹及其子文件会被复制到发布目录:<ItemGroup> <!-- 路径根据Assets相对于csproj的位置调整,示例中Assets在src根目录,csproj在src/appfolder下 --> <None Include="..\Assets\**" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup>这样
dotnet publish时会自动把Assets文件夹打包到/app/publish目录,最终镜像的/app目录下就会包含该文件夹。方案二:在Dockerfile中手动复制(临时方案)
如果不想修改项目文件,可以在Dockerfile的final阶段新增复制步骤,直接从build阶段把Assets文件夹拷贝到容器中:FROM base AS final WORKDIR /app COPY --from=publish /app/publish . # 新增这行,将build阶段的Assets文件夹复制到容器的/app目录下 COPY --from=build /src/Assets ./Assets ENTRYPOINT ["dotnet", "app.dll"]注意:这种方式仅在容器环境生效,本地发布项目时不会包含Assets文件夹,适合临时场景。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

