From 33c8344927b3e2c41e970b339c68e1b52f98b7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Gonz=C3=A1lez=20Castro?= <27441273+OnlyOnePro@users.noreply.github.com> Date: Wed, 7 Feb 2024 15:20:02 +0100 Subject: [PATCH] Updated package dependencies & improved docker support --- .dockerignore | 32 ++++++++++++ Dockerfile | 49 +++++++++++------- .../NStart.Tests.FunctionalityTests.csproj | 6 +-- .../NStart.Tests.IntegrationTests.csproj | 6 +-- NStart/NStart.csproj | 14 +++--- README.Docker.md | 24 +++++++++ compose.yaml | 50 +++++++++++++++++++ 7 files changed, 150 insertions(+), 31 deletions(-) create mode 100644 .dockerignore create mode 100644 README.Docker.md create mode 100644 compose.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e5c60ab --- /dev/null +++ b/.dockerignore @@ -0,0 +1,32 @@ +# Include any files or directories that you don't want to be copied to your +# container here (e.g., local build artifacts, temporary files, etc.). +# +# For more help, visit the .dockerignore file reference guide at +# https://docs.docker.com/go/build-context-dockerignore/ + +**/.DS_Store +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/bin +**/charts +**/docker-compose* +**/compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/Dockerfile b/Dockerfile index c51baf7..3edcd49 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,36 @@ -#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. +# syntax=docker/dockerfile:1 -FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base -WORKDIR /app -EXPOSE 80 -EXPOSE 443 +# Application build stage +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build +COPY . /source +WORKDIR /source/NStart + +ARG TARGETARCH -FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build -WORKDIR /src -COPY ["NStart/NStart.csproj", "NStart/"] -RUN dotnet restore "NStart/NStart.csproj" -COPY . . -WORKDIR "/src/NStart" -RUN dotnet build "NStart.csproj" -c Release -o /app/build +RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \ + dotnet publish -a ${TARGETARCH/amd64/x64} --use-current-runtime --self-contained false -o /app -FROM build AS publish -RUN dotnet publish "NStart.csproj" -c Release -o /app/publish +# If you need to enable globalization and time zones: +# https://github.com/dotnet/dotnet-docker/blob/main/samples/enable-globalization.md -FROM base AS final + +# Application run stage +FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS final WORKDIR /app -COPY --from=publish /app/publish . -#ENTRYPOINT ["dotnet", "NStart.dll"] -CMD ASPNETCORE_URLS=http://*:$PORT dotnet NStart.dll +COPY --from=build /app . + +# Globalization & timezones configuration +ENV \ + DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false \ + LC_ALL=en_US.UTF-8 \ + LANG=en_US.UTF-8 + +RUN apk add --no-cache \ + icu-data-full \ + icu-libs + +RUN apk add --no-cache tzdata + +USER $APP_UID + +ENTRYPOINT ["dotnet", "NStart.dll"] \ No newline at end of file diff --git a/NStart.Tests.FunctionalityTests/NStart.Tests.FunctionalityTests.csproj b/NStart.Tests.FunctionalityTests/NStart.Tests.FunctionalityTests.csproj index 3666d38..5be7c9c 100644 --- a/NStart.Tests.FunctionalityTests/NStart.Tests.FunctionalityTests.csproj +++ b/NStart.Tests.FunctionalityTests/NStart.Tests.FunctionalityTests.csproj @@ -8,10 +8,10 @@ - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/NStart.Tests.IntegrationTests/NStart.Tests.IntegrationTests.csproj b/NStart.Tests.IntegrationTests/NStart.Tests.IntegrationTests.csproj index fe0692d..b354ead 100644 --- a/NStart.Tests.IntegrationTests/NStart.Tests.IntegrationTests.csproj +++ b/NStart.Tests.IntegrationTests/NStart.Tests.IntegrationTests.csproj @@ -8,10 +8,10 @@ - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/NStart/NStart.csproj b/NStart/NStart.csproj index 35e9653..1489ec3 100644 --- a/NStart/NStart.csproj +++ b/NStart/NStart.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -15,14 +15,14 @@ - - - + + + - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/README.Docker.md b/README.Docker.md new file mode 100644 index 0000000..092e4a3 --- /dev/null +++ b/README.Docker.md @@ -0,0 +1,24 @@ +### Building and running your application + +When you're ready, start your application by running: +`docker compose up --build`. + +Your application will be available at http://localhost:8080. + +### Deploying your application to the cloud + +First, build your image, e.g.: `docker build -t myapp .`. +If your cloud uses a different CPU architecture than your development +machine (e.g., you are on a Mac M1 and your cloud provider is amd64), +you'll want to build the image for that platform, e.g.: +`docker build --platform=linux/amd64 -t myapp .`. + +Then, push it to your registry, e.g. `docker push myregistry.com/myapp`. + +Consult Docker's [getting started](https://docs.docker.com/go/get-started-sharing/) +docs for more detail on building and pushing. + +### References +* [Docker's .NET guide](https://docs.docker.com/language/dotnet/) +* The [dotnet-docker](https://github.com/dotnet/dotnet-docker/tree/main/samples) + repository has many relevant samples and docs. \ No newline at end of file diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..45269e8 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,50 @@ +# Comments are provided throughout this file to help you get started. +# If you need more help, visit the Docker compose reference guide at +# https://docs.docker.com/go/compose-spec-reference/ + +# Here the instructions define your application as a service called "server". +# This service is built from the Dockerfile in the current directory. +# You can add other services your application may depend on here, such as a +# database or a cache. For examples, see the Awesome Compose repository: +# https://github.com/docker/awesome-compose +services: + server: + build: + context: . + target: final + ports: + - 8080:8080 + +# The commented out section below is an example of how to define a PostgreSQL +# database that your application can use. `depends_on` tells Docker Compose to +# start the database before your application. The `db-data` volume persists the +# database data between container restarts. The `db-password` secret is used +# to set the database password. You must create `db/password.txt` and add +# a password of your choosing to it before running `docker compose up`. +# depends_on: +# db: +# condition: service_healthy +# db: +# image: postgres +# restart: always +# user: postgres +# secrets: +# - db-password +# volumes: +# - db-data:/var/lib/postgresql/data +# environment: +# - POSTGRES_DB=example +# - POSTGRES_PASSWORD_FILE=/run/secrets/db-password +# expose: +# - 5432 +# healthcheck: +# test: [ "CMD", "pg_isready" ] +# interval: 10s +# timeout: 5s +# retries: 5 +# volumes: +# db-data: +# secrets: +# db-password: +# file: db/password.txt +