【问题标题】:.NET Core 2.0 Identity Server + MVC in Docker - build fails on MacOS.NET Core 2.0 Identity Server + MVC in Docker - 在 MacOS 上构建失败
【发布时间】:2018-08-28 16:38:32
【问题描述】:

我正在尝试从 MacOS 对 .NET Core 2.0 应用程序进行 Docker 化,这是一个使用 Identity Server 4 的 MVC 应用程序。我无法找到有关此错误消息的任何信息:

MacBook-Pro-3:myproject myuser$ sudo docker build -t mycompany/myproject .
Password:
Sending build context to Docker daemon  122.6MB
Step 1/10 : FROM microsoft/aspnetcore-build:2.0 AS build-env
 ---> 76ce1481a4b8
Step 2/10 : WORKDIR /app
 ---> Using cache
 ---> e4ac320f97de
Step 3/10 : COPY *.csproj ./
 ---> Using cache
 ---> d6e02527b792
Step 4/10 : RUN dotnet restore
 ---> Running in b3545ba0375f
System.BadImageFormatException: Could not load file or assembly 'System.Security.Cryptography.Primitives, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. An attempt was made to load a program with an incorrect format.

File name: 'System.Security.Cryptography.Primitives, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at Microsoft.DotNet.Cli.Telemetry.Sha256Hasher.HashWithNormalizedCasing(String text)
   at Microsoft.DotNet.Cli.Utils.ApplicationInsightsEntryFormat.<>c__DisplayClass10_0.<WithAppliedToPropertiesValue>b__1(KeyValuePair`2 p)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at Microsoft.DotNet.Cli.Utils.ApplicationInsightsEntryFormat.WithAppliedToPropertiesValue(Func`2 func)
   at Microsoft.DotNet.Cli.Telemetry.TelemetryFilter.<Filter>b__3_0(ApplicationInsightsEntryFormat r)
   at System.Linq.Enumerable.SelectListIterator`2.ToList()
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Microsoft.DotNet.Cli.Telemetry.TelemetryFilter.Filter(Object objectToFilter)
   at Microsoft.DotNet.Cli.Utils.TelemetryEventEntry.SendFiltered(Object o)
   at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, ITelemetry telemetryClient)
   at Microsoft.DotNet.Cli.Program.Main(String[] args)


The command '/bin/sh -c dotnet restore' returned a non-zero code: 1

该应用程序在我的机器上(在 Docker 之外)上构建并运行良好 - 只有在运行“docker build -t mycompany/myproject”时才会发生这种情况。

这是我的 Dockerfile:

FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

如果有帮助,这里是 Web 应用程序的 .csproj 文件:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <UserSecretsId>some-guid-000-0000-0000-00</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Consul" Version="0.7.2.4" />
    <PackageReference Include="IdentityServer4.AspNetIdentity" Version="2.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.2" PrivateAssets="All" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.3" PrivateAssets="All" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\MyCompany.Core.Model\MyCompany.Core.Model.csproj" />
    <ProjectReference Include="..\MyCompany.Core.Contract\MyCompany.Core.Contract.csproj" />
    <ProjectReference Include="..\MyCompany.Core.Service\MyCompany.Core.Service.csproj" />
    <ProjectReference Include="..\MyCompany.Core.ViewModel\MyCompany.Core.ViewModel.csproj" />
    <ProjectReference Include="..\MyCompany.Core\MyCompany.Core.csproj" />
    <ProjectReference Include="..\MyCompany.Data.Contract\MyCompany.Data.Contract.csproj" />
    <ProjectReference Include="..\MyCompany.Data.Model\MyCompany.Data.Model.csproj" />
    <ProjectReference Include="..\MyCompany.Data\MyCompany.Data.csproj" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Scripts\view\" />
    <Folder Include="Scripts\view\home\" />
  </ItemGroup>

</Project>

更新:我还尝试在 Dockerfile 中使用此构建目标:

FROM microsoft/dotnet:latest AS build-env

最初的错误消失了,但在同一构建步骤中出现了新问题:

Step 1/10 : FROM microsoft/dotnet:latest AS build-env
latest: Pulling from microsoft/dotnet
Digest: sha256:580c65dd8bbbd75ba0ee74fff146cb44901f9be0ef233cd9d1399e1f9a8cfb11
Status: Downloaded newer image for microsoft/dotnet:latest
 ---> ae53eff0f099
Step 2/10 : WORKDIR /app
 ---> Using cache
 ---> 53551996e135
Step 3/10 : COPY *.csproj ./
 ---> Using cache
 ---> 1729e42c4ef1
Step 4/10 : RUN dotnet restore
 ---> Running in 6b3f62681fc6
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(895,5): warning MSB3202: The project file "/MyCompany.Core.Model/MyCompany.Core.Model.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(895,5): warning MSB3202: The project file "/MyCompany.Core.Contract/MyCompany.Core.Contract.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(895,5): warning MSB3202: The project file "/MyCompany.Core.Service/MyCompany.Core.Service.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(895,5): warning MSB3202: The project file "/MyCompany.Core.ViewModel/MyCompany.Core.ViewModel.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(895,5): warning MSB3202: The project file "/MyCompany.Core/MyCompany.Core.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(895,5): warning MSB3202: The project file "/MyCompany.Data.Contract/MyCompany.Data.Contract.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(895,5): warning MSB3202: The project file "/MyCompany.Data.Model/MyCompany.Data.Model.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(895,5): warning MSB3202: The project file "/MyCompany.Data/MyCompany.Data.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(986,5): warning MSB3202: The project file "/MyCompany.Core.Model/MyCompany.Core.Model.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(986,5): warning MSB3202: The project file "/MyCompany.Core.Contract/MyCompany.Core.Contract.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(986,5): warning MSB3202: The project file "/MyCompany.Core.Service/MyCompany.Core.Service.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(986,5): warning MSB3202: The project file "/MyCompany.Core.ViewModel/MyCompany.Core.ViewModel.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(986,5): warning MSB3202: The project file "/MyCompany.Core/MyCompany.Core.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(986,5): warning MSB3202: The project file "/MyCompany.Data.Contract/MyCompany.Data.Contract.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(986,5): warning MSB3202: The project file "/MyCompany.Data.Model/MyCompany.Data.Model.csproj" was not found. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(986,5): warning MSB3202: The project file "/MyCompany.Data/MyCompany.Data.csproj" was not found. [/app/MyCompany.csproj]
  Restoring packages for /app/MyCompany.csproj...
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(104,5): error : An error occurred while retrieving package metadata for 'System.Security.Principal.Windows.4.3.0' from source '/usr/share/dotnet/sdk/NuGetFallbackFolder'. [/app/MyCompany.csproj]
/usr/share/dotnet/sdk/2.1.101/NuGet.targets(104,5): error :   Invalid character in the given encoding. Line 1, position 1. [/app/MyCompany.csproj]
  Restoring packages for /app/MyCompany.csproj...
The command '/bin/sh -c dotnet restore' returned a non-zero code: 1

【问题讨论】:

    标签: docker asp.net-core .net-core asp.net-identity identityserver4


    【解决方案1】:

    我在公司生产环境中遇到了这个错误。与安装的多个 .Net Core 版本和不匹配的 .Net Standard 版本有关。

    在您的机器上它可以工作,因为它使用了正确的版本,因为当您安装 .Net Core 时,最新版本被设置为默认版本。

    但在您的解决方案中它指向另一个包版本。您可以做的解决方法是:

    1. 转到部署文件夹
    2. 使用以下命令打开 System.Security.Cryptography.Primitives.dlldotpeek这样的工具
    3. 在您的 web.config 中使用 bindredirect 指向正确的 newVersion

      <dependentAssembly>
        <assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.0.x.x"/>
      </dependentAssembly>
      

    您还可以将解决方案中的每个包更新到与您的核心版本匹配的正确 .Net 标准版本。

    【讨论】:

    • 我很困惑这将如何应用于构建到 Docker 映像中的应用程序?我也在 MacOS 上执行此操作 - 所以这些步骤是不可行的。本地只安装了一个版本的 .NET Core,但这在 Docker 中并不重要,不是吗?这个环境对我来说是新的,请耐心等待。
    • 您的 docker 映像的 .NET Core 和 .Net Standart 版本与您的解决方案版本不同。你所说的一切都指向和我一样的问题,除了我正在运行一个完整的 windows docker 映像。
    • @TsarBomba 您还可以标准化解决方案中的软件包版本,正如我在答案末尾提到的那样。只需在各处安装/设置相同的 .Net Standard 版本即可防止冲突
    • 我没有 web.config,也没有看到项目/解决方案的任何其他文件中引用的程序集。 “netcoreapp2.0”似乎是整个解决方案的标准。
    • @TsarBomba 您应该检查每个项目是否都指向相同的 .Net 标准
    猜你喜欢
    • 1970-01-01
    • 2018-02-12
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2019-04-09
    • 2018-11-20
    相关资源
    最近更新 更多