From 07f13e35e7fb3b8514b6ebdd0bf076c3a9b35c26 Mon Sep 17 00:00:00 2001 From: Nano Taboada <87288+nanotaboada@users.noreply.github.com> Date: Sun, 4 May 2025 19:46:06 -0300 Subject: [PATCH 1/2] feat: add multi-stage Dockerfile for building and running app --- Dockerfile | 35 +++++++++++++++++++++++++++++++++++ README.md | 17 ++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7eca9ca --- /dev/null +++ b/Dockerfile @@ -0,0 +1,35 @@ +# - Stage 1 -------------------------------------------------------------------- + + FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build + WORKDIR /src + + # Copy and restore dependencies + COPY src/Dotnet.Samples.AspNetCore.WebApi/*.csproj ./Dotnet.Samples.AspNetCore.WebApi/ + RUN dotnet restore ./Dotnet.Samples.AspNetCore.WebApi + + # Copy source and publish + COPY src/Dotnet.Samples.AspNetCore.WebApi ./Dotnet.Samples.AspNetCore.WebApi + WORKDIR /src/Dotnet.Samples.AspNetCore.WebApi + RUN dotnet publish -c Release -o /app/publish + +# - Stage 2 -------------------------------------------------------------------- + + FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime + WORKDIR /app + + # Copy published output + # Note: This includes the SQLite database because it's marked as with + # in the .csproj file. No need to copy it manually. + COPY --from=build /app/publish . + + # Add non-root user (aspnetcore) for security hardening + RUN adduser --disabled-password --gecos '' aspnetcore \ + && chown -R aspnetcore:aspnetcore /app + USER aspnetcore + + # Set environment variables + ENV ASPNETCORE_URLS=http://+:9000 + ENV ASPNETCORE_ENVIRONMENT=Production + + # Default entrypoint + ENTRYPOINT ["dotnet", "Dotnet.Samples.AspNetCore.WebApi.dll"] diff --git a/README.md b/README.md index 34da3f2..e7e7c8b 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ _Figure: Simplified, conceptual project structure and main application flow. Not dotnet watch run --project src/Dotnet.Samples.AspNetCore.WebApi/Dotnet.Samples.AspNetCore.WebApi.csproj ``` -## Documentation +## Documentation (Development-only) ```console https://localhost:9000/swagger/index.html @@ -34,6 +34,21 @@ https://localhost:9000/swagger/index.html ![API Documentation](/assets/images/Swagger.png) +## Container + +This project includes a multi-stage `Dockerfile` for local development and production builds. + +### Build the image + +```bash +docker build -t aspnetcore-app . +``` + +### Run the container + +```bash +docker run -p 9000:9000 aspnetcore-app + ## Credits The solution has been coded using [Visual Studio Code](https://code.visualstudio.com/) with the [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) extension. From f290d9613c7015c36a2f34e95db4429cd1107ac5 Mon Sep 17 00:00:00 2001 From: Nano Taboada <87288+nanotaboada@users.noreply.github.com> Date: Sun, 4 May 2025 20:12:28 -0300 Subject: [PATCH 2/2] chore: add .dockerignore to optimize build context --- .dockerignore | 339 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..c4ea545 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,339 @@ +# https://github.com/dotnet/runtime/blob/main/.dockerignore + +### VisualStudio ### + +# Tool Runtime Dir +**/.dotnet/ +**/.packages/ +**/.tools/ + +# User-specific files +**/*.suo +**/*.user +**/*.userosscache +**/*.sln.docstates + +# Build results +**/artifacts/ +**/.idea/ +**/[Dd]ebug/ +**/[Dd]ebugPublic/ +**/[Rr]elease/ +**/[Rr]eleases/ +**/bld/ +**/[Bb]in/ +**/[Oo]bj/ +**/msbuild.log +**/msbuild.err +**/msbuild.wrn +**/msbuild.binlog +**/.deps/ +**/.dirstamp +**/.libs/ +**/*.lo +**/*.o + +# Cross building rootfs +**/cross/rootfs/ +**/cross/android-rootfs/ + +# Visual Studio +**/.vs/ + +# Ionide +**/.ionide/ + +# MSTest test Results +**/[Tt]est[Rr]esult*/ +**/[Bb]uild[Ll]og.* + +#NUNIT +**/*.VisualState.xml +**/TestResult.xml + +# Build Results of an ATL Project +**/[Dd]ebugPS/ +**/[Rr]eleasePS/ +**/dlldata.c + +**/*_i.c +**/*_p.c +**/*.ilk +**/*.meta +**/*.obj +**/*.pch +**/*.pdb +!**/_.pdb +**/*.pgc +**/*.pgd +**/*.rsp +**/*.sbr +**/*.tlb +**/*.tli +**/*.tlh +**/*.tmp +**/*.tmp_proj +**/*.log +**/*.vspscc +**/*.vssscc +**/.builds +**/*.pidb +**/*.svclog +**/*.scc + +# Chutzpah Test files +**/_Chutzpah* + +# Visual C++ cache files +**/ipch/ +**/*.aps +**/*.ncb +**/*.opendb +**/*.opensdf +**/*.sdf +**/*.cachefile +**/*.VC.db + +# Visual Studio profiler +**/*.psess +**/*.vsp +**/*.vspx + +# TFS 2012 Local Workspace +**/$tf/ + +# Guidance Automation Toolkit +**/*.gpState + +# ReSharper is a .NET coding add-in +**/_ReSharper*/ +**/*.[Rr]e[Ss]harper +**/*.DotSettings.user + +# JustCode is a .NET coding addin-in +**/.JustCode + +# TeamCity is a build add-in +**/_TeamCity* + +# DotCover is a Code Coverage Tool +**/*.dotCover + +# NCrunch +**/_NCrunch_* +**/.*crunch*.local.xml + +# MightyMoose +**/*.mm.* +**/AutoTest.Net/ + +# Web workbench (sass) +**/.sass-cache/ + +# Installshield output folder +**/[Ee]xpress/ + +# DocProject is a documentation generator add-in +**/DocProject/buildhelp/ +**/DocProject/Help/*.HxT +**/DocProject/Help/*.HxC +**/DocProject/Help/*.hhc +**/DocProject/Help/*.hhk +**/DocProject/Help/*.hhp +**/DocProject/Help/Html2 +**/DocProject/Help/html + +# Publish Web Output +**/*.[Pp]ublish.xml +**/*.azurePubxml +**/*.pubxml +**/*.publishproj + +# NuGet Packages +**/*.nupkg +**/*.nuget.g.props +**/*.nuget.g.targets +**/*.nuget.cache +**/**/packages/* +**/project.lock.json +**/project.assets.json +**/*.nuget.dgspec.json + +# Windows Azure Build Output +**/csx/ +**/*.build.csdef + +# Windows Store app package directory +**/AppPackages/ + +# Others +**/*.Cache +**/ClientBin/ +**/[Ss]tyle[Cc]op.* +**/~$* +**/*.dbmdl +**/*.dbproj.schemaview +**/*.pfx +**/*.publishsettings +**/node_modules/ +**/*.metaproj +**/*.metaproj.tmp +**/bin.localpkg/ + +# RIA/Silverlight projects +**/Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +**/_UpgradeReport_Files/ +**/Backup*/ +**/UpgradeLog*.XML +**/UpgradeLog*.htm + +# SQL Server files +**/*.mdf +**/*.ldf + +# Business Intelligence projects +**/*.rdl.data +**/*.bim.layout +**/*.bim_*.settings + +# Microsoft Fakes +**/FakesAssemblies/ + +# C/C++ extension for Visual Studio Code +**/browse.VC.db +# Local settings folder for Visual Studio Code +**/**/.vscode/** +!**/**/.vscode/c_cpp_properties.json + +### MonoDevelop ### + +**/*.pidb +**/*.userprefs + +### Windows ### + +# Windows image file caches +**/Thumbs.db +**/ehthumbs.db + +# Folder config file +**/Desktop.ini + +# Recycle Bin used on file shares +**/$RECYCLE.BIN/ + +# Windows Installer files +**/*.cab +**/*.msi +**/*.msm +**/*.msp + +# Windows shortcuts +**/*.lnk + +### Linux ### + +**/*~ + +# KDE directory preferences +**/.directory + +### OSX ### + +**/.DS_Store +**/.AppleDouble +**/.LSOverride + +# Icon must end with two \r +**/Icon + +# Thumbnails +**/._* + +# Files that might appear on external disk +**/.Spotlight-V100 +**/.Trashes + +# Directories potentially created on remote AFP share +**/.AppleDB +**/.AppleDesktop +**/Network Trash Folder +**/Temporary Items +**/.apdisk + +# vim temporary files +**/[._]*.s[a-w][a-z] +**/[._]s[a-w][a-z] +**/*.un~ +**/Session.vim +**/.netrwhist +**/*~ + +# Visual Studio Code +**/.vscode/ + +# Private test configuration and binaries. +**/config.ps1 +**/**/IISApplications + +# VS debug support files +**/launchSettings.json + +# Snapcraft files +**/.snapcraft +**/*.snap +**/parts/ +**/prime/ +**/stage/ + +# CLR prebuilt generated files +!**/src/pal/prebuilt/idl/*_i.c + +# Valid 'debug' folder, that contains CLR debugging code +!**/src/**/debug + +# Ignore folders created by the CLR test build +**/TestWrappers_x64_[d|D]ebug +**/TestWrappers_x64_[c|C]hecked +**/TestWrappers_x64_[r|R]elease +**/TestWrappers_x86_[d|D]ebug +**/TestWrappers_x86_[c|C]hecked +**/TestWrappers_x86_[r|R]elease +**/TestWrappers_arm_[d|D]ebug +**/TestWrappers_arm_[c|C]hecked +**/TestWrappers_arm_[r|R]elease +**/TestWrappers_arm64_[d|D]ebug +**/TestWrappers_arm64_[c|C]hecked +**/TestWrappers_arm64_[r|R]elease +**/tests/src/common/test_runtime/project.json + +**/Vagrantfile +**/.vagrant + +# CMake files +**/CMakeFiles/ +**/cmake_install.cmake +**/CMakeCache.txt +**/Makefile + +# Cross compilation +**/cross/rootfs/* +**/cross/android-rootfs/* +# add x86 as it is ignored in 'Build results' +!**/cross/x86 + +#python import files +**/*.pyc + +# JIT32 files +**/src/jit32 + +# performance testing sandbox +**/sandbox + +# Allow the SQLite database to be included +!src/Dotnet.Samples.AspNetCore.WebApi/Data/players-sqlite3.db