diff --git "a/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/.dockerignore" "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/.dockerignore" new file mode 100644 index 000000000..ea8a4774d --- /dev/null +++ "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/.dockerignore" @@ -0,0 +1,19 @@ +# Общие системные файлы +.gitignore +.idea +.vscode +.vs +bin +obj +*.sqlite + +# Docker и окружение +docker/volumes/ +docker/.env* +docker-compose*.yml + +# Не тянем тесты в образ +PromoCodeFactory.UnitTests/ + +# Исключаем локальные publish-артефакты (если есть) +publish/ diff --git "a/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/PromoCodeFactory.DataAccess/DependencyInjection.cs" "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/PromoCodeFactory.DataAccess/DependencyInjection.cs" index 309297b94..7b462ed89 100644 --- "a/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/PromoCodeFactory.DataAccess/DependencyInjection.cs" +++ "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/PromoCodeFactory.DataAccess/DependencyInjection.cs" @@ -14,9 +14,9 @@ public static void AddEfDataAccess(this IServiceCollection services) { services.AddDbContext((sp, builder) => { - var conncetionString = sp.GetRequiredService().GetConnectionString("PromocodeFactoryDb") - ?? "Filename=PromoCodeFactory.sqlite"; - builder.UseSqlite(conncetionString); + var connectionString = sp.GetRequiredService().GetConnectionString("Default") + ?? throw new NotSupportedException("ConnectionStrings:Default not set"); + builder.UseSqlite(connectionString); }); services.AddScoped, EmployeeEfRepository>(); diff --git "a/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/PromoCodeFactory.WebHost/appsettings.json" "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/PromoCodeFactory.WebHost/appsettings.json" index 3d760c5fe..91f137bf3 100644 --- "a/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/PromoCodeFactory.WebHost/appsettings.json" +++ "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/PromoCodeFactory.WebHost/appsettings.json" @@ -12,7 +12,7 @@ } }, "ConnectionStrings": { - "PromocodeFactoryDb": "Filename=PromoCodeFactory.sqlite" + "Default": "Filename=PromoCodeFactory.sqlite" }, "AllowedHosts": "*" } diff --git "a/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/docker/.env" "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/docker/.env" new file mode 100644 index 000000000..6aa40124c --- /dev/null +++ "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/docker/.env" @@ -0,0 +1,10 @@ +ASPNETCORE_ENVIRONMENT=Development +HTTP_PORT_EXT=8091 +HTTP_PORT_INT=8080 + +SQL_LITE_PATH=/webhost/db +SQL_LITE_NAME=PromoCodeFactory.sqlite + +# Внутри контейнера используется своя собственная сеть +# в контейнере свой (перекрывает appsettings.Development.json) +# см. docker-compose.yml diff --git "a/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/docker/HW05.Dockerfile" "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/docker/HW05.Dockerfile" new file mode 100644 index 000000000..bd7124180 --- /dev/null +++ "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/docker/HW05.Dockerfile" @@ -0,0 +1,25 @@ +# build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build + +WORKDIR /src +# сначала только csproj — лучше кэшируется (все зависимые проекты тоже) +COPY ./PromoCodeFactory.Core/PromoCodeFactory.Core.csproj ./PromoCodeFactory.Core/ +COPY ./PromoCodeFactory.DataAccess/PromoCodeFactory.DataAccess.csproj ./PromoCodeFactory.DataAccess/ +COPY ./PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj ./PromoCodeFactory.WebHost/ + +RUN dotnet restore ./PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj + +# теперь весь код +COPY ./PromoCodeFactory.Core/ ./PromoCodeFactory.Core/ +COPY ./PromoCodeFactory.DataAccess/ ./PromoCodeFactory.DataAccess/ +COPY ./PromoCodeFactory.WebHost/ ./PromoCodeFactory.WebHost/ + +RUN dotnet publish ./PromoCodeFactory.WebHost -c Release -o /app/publish + +# run +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final +WORKDIR /app +COPY --from=build /app/publish ./ +ARG API_PORT_INT +EXPOSE ${API_PORT_INT} +ENTRYPOINT ["dotnet","PromoCodeFactory.WebHost.dll"] diff --git "a/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/docker/docker-compose.yml" "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/docker/docker-compose.yml" new file mode 100644 index 000000000..765bcb684 --- /dev/null +++ "b/Homeworks/05 \320\243\320\277\320\260\320\272\320\276\320\262\320\272\320\260 \320\262 docker/src/docker/docker-compose.yml" @@ -0,0 +1,24 @@ +name: promocode-factory + +services: + promocode-factory-api: + build: + context: .. + dockerfile: docker/HW05.Dockerfile + args: + API_PORT_INT: ${HTTP_PORT_INT} + env_file: + - .env + volumes: + - sqlite-data:${SQL_LITE_PATH} + environment: + # перекрывает appsettings.Development.json: + ConnectionStrings__Default: "Filename=${SQL_LITE_PATH}/${SQL_LITE_NAME}" + ASPNETCORE_ENVIRONMENT: ${ASPNETCORE_ENVIRONMENT} + ASPNETCORE_HTTP_PORTS: "${HTTP_PORT_INT}" + ports: + - "${HTTP_PORT_EXT}:${HTTP_PORT_INT}" + +volumes: + sqlite-data: + name: db