While working on a web app for my book club, I've decided to try containerizing the app with Docker, so I can update dependencies more easily. I host my apps on a Ubuntu Server 18.04 LTS, where I already have the .Net Core 2 and 3 frameworks installed. Instead of adding 5 and then 6 (currently in preview) after upgrading, I thought I might try creating a Docker image. I'm learning as I go along, so this might not be the best way of doing things.
I've tried this, but it was finicky and I didn't really like it, so I've decided to use two separate containers instead: one to build the backend part, one for the frontend. After both are done, I copy the results into the final container containing just the (linux) runtime and the built app, here creatively called
zblesk-web (which is also the name of a folder holding the project).
I ended up with this:
# Build Backend FROM mcr.microsoft.com/dotnet/sdk:5.0 AS dotnetbuild WORKDIR /source COPY *.sln . COPY zblesk-web/*.csproj ./zblesk-web/ RUN dotnet restore -r linux-x64 COPY zblesk-web/. ./zblesk-web/ WORKDIR /source/zblesk-web RUN dotnet publish -c Release -o /app --no-restore -r linux-x64 --self-contained false # Build FE FROM node:14 AS nodebuild WORKDIR /frontend COPY zblesk-web/ClientApp/package*.json ./ RUN npm install COPY zblesk-web/ClientApp/ . RUN npm run build -- --prod # Final image FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 WORKDIR /zblesk-web COPY --from=dotnetbuild /app ./ COPY --from=nodebuild /frontend/dist ./ClientApp ENTRYPOINT ["./zblesk-web"]
Again, this might not be the optimal way of doing it, but for now it works well for me.