How to integrate 'npm install' into ASP.NET CORE 2.1 Docker build How to integrate 'npm install' into ASP.NET CORE 2.1 Docker build docker docker

How to integrate 'npm install' into ASP.NET CORE 2.1 Docker build


Found the solution:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS baseWORKDIR /appEXPOSE 80FROM microsoft/dotnet:2.1-sdk AS buildWORKDIR /srcCOPY --from=frontend . .COPY ["myProject.WebUi/myProject.WebUi.csproj", "myProject.WebUi/"]COPY ["myProject.SearchIndex/myProject.SearchIndex.csproj", "myProject.SearchIndex/"]COPY ["myProject.SearchIndex.Common/myProject.SearchIndex.Common.csproj", "myProject.SearchIndex.Common/"]RUN dotnet restore "myProject.WebUi/myProject.WebUi.csproj"COPY . .WORKDIR "/src/myProject.WebUi"RUN apt-get update -yq && apt-get upgrade -yq && apt-get install -yq curl git nanoRUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && apt-get install -yq nodejs build-essentialRUN npm install -g npmRUN npm installRUN dotnet build "myProject.WebUi.csproj" -c Release -o /appFROM build AS publishRUN dotnet publish "myProject.WebUi.csproj" -c Release -o /appFROM base AS finalWORKDIR /appCOPY --from=publish /app .ENTRYPOINT ["dotnet", "myProject.WebUi.dll"]


Update for ASP.NET Core 3.0 Web App with SPA

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS buildWORKDIR /app# Prevent 'Warning: apt-key output should not be parsed (stdout is not a terminal)'ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1# install NodeJS 13.x# see https://github.com/nodesource/distributions/blob/master/README.md#debRUN apt-get update -yq RUN apt-get install curl gnupg -yq RUN curl -sL https://deb.nodesource.com/setup_13.x | bash -RUN apt-get install -y nodejs# copy csproj and restore as distinct layersCOPY *.sln .COPY MyApplication/*.csproj ./MyApplication/RUN dotnet restore# copy everything else and build appCOPY MyApplication/. ./MyApplication/WORKDIR /app/MyApplicationRUN dotnet publish -c Release -o outFROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtimeWORKDIR /appCOPY --from=build /app/MyApplication/out ./ENTRYPOINT ["dotnet", "MyApplication.dll"]

Then

docker build --pull -t MyApplicationdocker run --name myapp --rm -it -p 8000:80 MyApplication

The app will be available at localhost:8000.


In my case, I needed to have a docker image running a nodeJS project which is able to execute script like "dotnet xxx.xxx.dll".

I was struggling trying to fix "dotnet command not found" inside my docker.

I succeeded to fix it easily by adding at the beginning of my Dockerfile:

FROM node:alpine AS node_baseFROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-envCOPY --from=node_base . .RUN echo "NODE Version:" && node --versionRUN echo "NPM Version:" && npm --versionRUN echo "dotnet Version:" &&  dotnet --version

(you can adjust versions accordingly)

I took inspiration from this github issue.

Hope this trick can help you too :)