具有文件内容的 .Net 资源使 docker build 失败

Posted

技术标签:

【中文标题】具有文件内容的 .Net 资源使 docker build 失败【英文标题】:.Net resource with files content make docker build fail 【发布时间】:2020-07-13 08:23:40 【问题描述】:

“dotnet build”构建项目没有错误,同时docker build报如下错误:

/src/Audit.Worker/Example/Resources.resx : error MSB3103: Invalid Resx file. System.IO.DirectoryNotFoundException: Could not find a part of the path '/src/Audit.Worker/Example/data/example.yaml'. [/src/Audit.Worker/Audit.Worker.csproj]

Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["./Audit.Worker/Audit.Worker.csproj", "Audit.Worker/"]
RUN dotnet restore "Audit.Worker/Audit.Worker.csproj"
COPY . /src/
WORKDIR "/src/Audit.Worker/"
RUN dotnet build "Audit.Worker.csproj" -c Release -o /apps

FROM build AS publish
RUN dotnet publish "Audit.Worker.csproj" -c Release -o /apps

FROM base AS final
WORKDIR /apps
COPY --from=publish /apps .
ENTRYPOINT ["dotnet", "Audit.Worker.dll"]

【问题讨论】:

【参考方案1】:

最后,我知道是什么原因了。

Visual Studio 资源工具(我假设它负责 .resx 文件内容生成)假设文件路径不区分大小写,并以小写形式生成所有文件路径(即 data\example.yaml )。同时用于构建的基础 docker 镜像基于 Linux,路径区分大小写。

  <data name="Example" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>data\example.yaml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
  </data>

底线:虽然可行的解决方案是手动编辑 .resx 文件(或在需要的地方使用小写字母),但我们决定完全避免使用资源。似乎没有适当的支持了。

【讨论】:

没有适当的支持是什么意思? 他们可能指的是微软对这个错误的态度:developercommunity.visualstudio.com/t/…【参考方案2】:

我发现的解决方案是您必须通过“添加资源”->“添加现有文件”添加文件。在此之后,我在构建容器时不再收到此错误。

【讨论】:

以上是关于具有文件内容的 .Net 资源使 docker build 失败的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 本地化资源显式本地化不加载本地化文件

。NET Core 3.1 gRPC Docker:无法使原型路径相对

配置docker静态IP地址

具有本机依赖关系的 Blazor .NET 6 无法构建为 Docker 映像

docker项目部署

如何从 MSIL 或 .NET PE 文件中提取资源内容