Search code examples
dockerasp.net-coredockerfileasp.net-core-2.2

"An assembly specified in the application dependencies manifest was not found" using docker


I am trying to dockerize an an angular aspnet core 2.2 webapi using the following dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:2.2.105 AS build
WORKDIR /src

# Copy csproj and restore as distinct layers
COPY ["Fightplan_v1/Fightplan_v1.csproj", "Fightplan_v1/"]
COPY ["Fightplan_v1.Autogenerate/Fightplan_v1.Autogenerate.csproj", "Fightplan_v1.Autogenerate/"]
COPY ["Fightplan_v1.Autogenerate.Test/Fightplan_v1.Autogenerate.Test.csproj", "Fightplan_v1.Autogenerate.Test/"]
COPY ["Fightplan_v1.Database/Fightplan_v1.Database.csproj", "Fightplan_v1.Database/"]
COPY ["Fightplan_v1.Helpers/Fightplan_v1.Helpers.csproj", "Fightplan_v1.Helpers/"]
COPY ["Fightplan_v1.Jobs/ConvertImagestoBlob/Fightplan_v1.ConvertImagestoBlob.csproj", "Fightplan_v1.Jobs/ConvertImagestoBlob/"]
COPY ["Fightplan_v1.Models/Fightplan_v1.Models.csproj", "Fightplan_v1.Models/"]
COPY ["Fightplan_v1.Shared/Fightplan_v1.Shared.csproj", "Fightplan_v1.Shared/"]
RUN dotnet restore "Fightplan_v1/Fightplan_v1.csproj"

# Copy everything else and build
COPY . .
WORKDIR "/src/Fightplan_v1"
RUN dotnet build "Fightplan_v1.csproj" -c Release -o /app

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

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app
COPY --from=build /app .

EXPOSE 80
ENTRYPOINT ["dotnet", "Fightplan_v1.dll"]

The build command used is:

docker build -f .\fp.dockerfile -t test .

The build goes through fine but when I try to run it using:

docker run -p 5100:80 -it test

I get the following error: enter image description here

I have tried:

  1. Adding -r linux-x64 to the end of publish to define the runtime: RUN dotnet publish "Fightplan_v1.csproj" -c Release -o /app -r linux-x64
  2. Adding <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest> to my .csproj file

None of the above fixes work unfortunately.

Since this is combined poject of an angular application and a webapi I might be missing some installations/dependencies?


Solution

  • You are copying the runtime files from wrong layer

    COPY --from=build /app .
    

    Try to change it to

    COPY --from=publish /app .
    

    Also, you probably need to separate out path in build and publish steps:

    RUN dotnet build "Fightplan_v1.csproj" -c Release -o /app/build
    RUN dotnet publish "Fightplan_v1.csproj" -c Release -o /app/publish
    

    and then copy runtime files from the publish folder

    COPY --from=publish /app/publish .
    

    Edit. Basically, you need to copy publish artifacts into runtime, not build. Build will produce deps.json, which will lists all external dependencies, and during runtime this libraries are resolving using NuGet cache, if it is empty you will see an error. To copy dependencies along with project files you need to run publish. So I assume, that theoretically dotnet build can be omitted, and is using only to discover compilation errors on early stage of docker build.