在以x86为目标的docker中运行.NET Core项目会抛出System.BadImageFormatException

时间:2019-05-24 08:44:08

标签: c# .net docker .net-core x86

我正在尝试构建一个简单的32位.NET Core项目。 我发现了这个问题:https://github.com/dotnet/core/issues/901,如果我在本地构建项目,它实际上解决了问题,但是如果我使用Dockerfile(Docker容器是linux)构建项目,则无法解决问题。

Dockerfile(默认):

FROM microsoft/dotnet:2.2-runtime AS base
WORKDIR /app

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY TestDocker.csproj TestDocker/
RUN dotnet restore TestDocker/TestDocker.csproj
COPY . ./TestDocker
WORKDIR /src/TestDocker
RUN dotnet build TestDocker.csproj -c Release -o /app


FROM build AS publish
RUN dotnet publish TestDocker.csproj -c Release -o /app

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

CsProj(仅PlatformTarget已更改)

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <PlatformTarget>x86</PlatformTarget>
  </PropertyGroup>

</Project>

构建成功完成,当我尝试使用docker run运行它时,我得到了

Unhandled Exception: System.BadImageFormatException: Could not load file or asse
mbly '/app/TestDocker.dll'. An attempt was made to load a program with an incorr
ect format.

如果我在内部版本中打印dotnet --info,则它显然使用x64->

RID: debian.9-x64

我怀疑我需要某种方式来强制使用x86 dotnet,是否可以使用单独的dotnet sdk 32位图像?

1 个答案:

答案 0 :(得分:1)

official Microsoft container images被标记为x86_64。因此,您可能不走运。更糟糕的是,.NET Core doesn't even do releases for x86

一种选择是自己做所有事情:

  1. 为x86的Debian构建.NET Core 2.2:https://github.com/liserdarts/dotnetcore-build-x86-Linux。您可以为此使用debian 386容器映像。然后将其保存在某个地方。

  2. 构建一个debian容器映像,并在其中安装在步骤1中构建的.NET Core 2.2 SDK。您可以看到how Microsoft constructs their container images并对其进行尽可能的调整。

  3. 使用此自建的容器映像代替assertKeyInErrorDict