2

I'm trying to Docker-ize a .NET Core 2.0 app, which is an MVC app using Identity Server 4, from MacOS. I'm not able to find any info on this error message:

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

The app builds and runs fine on my machine (outside of Docker) - this only happens when running "docker build -t mycompany/myproject ."

Here's my 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"]

If this helps, here is the .csproj file of the web application:

<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>

UPDATE: I also tried using this build target in the Dockerfile:

FROM microsoft/dotnet:latest AS build-env

The initial error goes away, but there are new problems on the same build step:

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
Tsar Bomba
  • 1,047
  • 6
  • 29
  • 52

1 Answers1

0

I had this error in my company production env. Is related with multiple versions of .Net Core installed and mismatching .Net Standard versions.

In your machine it works because is using the correct version given that when you install .Net Core, the most recent version is set as the default one.

But in your solution It's pointing to another package version. What you can do as workaround is:

  1. Go to the deployment folder
  2. Open the System.Security.Cryptography.Primitives.dll with an tool like dotpeek enter image description here
  3. Use bindredirect in you web.config to point to the right 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>
    

You can also update every package from the solution to the right .Net Standard version that match you Core version.

Fals
  • 6,813
  • 4
  • 23
  • 43
  • I'm confused how this would apply to an app being built into a Docker image? I'm doing this from MacOS, also - so these steps aren't doable. There is only one version of .NET Core installed locally, but that wouldn't matter in Docker, would it? This environment is new to me, bear with me. – Tsar Bomba Mar 20 '18 at 12:07
  • Your docker image then has a different version of .NET Core and .Net Standart than your solution version. Everything you said, point to the same problem as mine, besides I'm running a full windows docker image. – Fals Mar 20 '18 at 12:07
  • @TsarBomba you can also normalize the version of the packages in the solutions as I mentioned at the end of the answer. Just install/set the same .Net Standard version everywhere to prevent the conflict – Fals Mar 20 '18 at 12:13
  • I do not have a web.config and do not see that assembly referenced in any other file in the project/solution. "netcoreapp2.0" appears to be the standard, across the solution. – Tsar Bomba Mar 20 '18 at 12:24
  • @TsarBomba you should check if every project points to the same .Net Standard then – Fals Mar 20 '18 at 12:30
  • Yes, every .csproj is "netcoreapp2.0" – Tsar Bomba Mar 20 '18 at 12:34
  • I'm talking about .Net Standard, not .Net Core. System.Security.Cryptography.Primitives resides inside the .Net Standard package. Check the .Net Standard. They are Nuget packages – Fals Mar 20 '18 at 12:40
  • Got it. In the Assembly Browser in VS for Mac, I see this for that assembly: [assembly: AssemblyVersion ("4.1.0.0")] - there is no mention of which .Net Standard this is. Am Googling around to see if this means anything. – Tsar Bomba Mar 20 '18 at 12:51