Zuguki
@Zuguki
I'm working all the time!

Почему получается подключить Core в Dockerfile?

Всем привет.

У меня есть микросервисы на .net, каждый микросервис содержит в себе 4 проекта (api, logic, infractructure, domain), при этом я решил подключать к микросервисам Core проект, просто подключая его к .sol.
Дальше я сгенерировал Dockerfile с помощью Rider и решил попробовать сбилдить его, но у меня это не получается сделать, постоянно падает ошибка при подключении Core либы, но на других асембли пишет ERROR (именно на тех, которые лежат на уровень выше, чем Dockerfile).

Так выглядит Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
EXPOSE 10001

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Develop
WORKDIR /src
COPY ["GChain.Identity.Api/GChain.Identity.Api.csproj", "GChain.Identity.Api/"]
COPY ["GChain.Identity.Infrastructure/GChain.Identity.Infrastructure.csproj", "GChain.Identity.Infrastructure/"]
COPY ["GChain.Identity.Logic/GChain.Identity.Logic.csproj", "GChain.Identity.Logic/"]
COPY ["GChain.Identity.Domain/GChain.Identity.Domain.csproj", "GChain.Identity.Domain/"]
COPY ["../Libs/GChain.Core/GChain.Core.csproj", "../Libs/GChain.Core/"]
RUN dotnet restore "GChain.Identity.Api/GChain.Identity.Api.csproj"
COPY . .
WORKDIR "/src/GChain.Identity.Api"
RUN dotnet build "GChain.Identity.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Develop
RUN dotnet publish "GChain.Identity.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "GChain.Identity.Api.dll"]


В целом, если я помещу асембли (api, logic, infrastructure, domain) на один уровень с Dockerfile, то Error не будет падать, но Core я не могу добавить в ту же директорию, тк его должны использовать и другие микросервисы.

Получается 2 вопроса:
Как правильно подключить ассембли, которые лежат на 1 уровень выше, чем Dockerfile?
Как подключить Core assembly, которыя лежит на 2 уровня выше, при этом ее будут использовать и другие микросервисы. (Core - там просто class library)?

Так выглядит ошибка: 6626adfea5b72737176495.png
  • Вопрос задан
  • 743 просмотра
Решения вопроса 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Если я правильно понял задачу (использовать одну общую либу Core для нескольких проектов), то я бы использовал 2 варианта:
- Создание NuGet пакета (если Core изменяется не часто), затем подключаем его в любом проекте.
- Или docker multi-stage builds (если Core изменяется часто).

Пример docker multi-stage builds с авто сборкой Core lib + Api proj (поправить пути и наименования директорий при необходимости):
# Build Core lib
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS core-build
WORKDIR /src
COPY ["../Core/Core.csproj", "./Core/"]
RUN dotnet restore "./Core/Core.csproj"
COPY ["../Core/", "./Core/"]
RUN dotnet build "./Core/Core.csproj" -c Release -o /app/core

# Build API proj
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS api-build
WORKDIR /src
COPY ["Service/API/API.csproj", "./Service/API/"]
RUN dotnet restore "./Service/API/API.csproj"
COPY ["Service/API/", "./Service/API/"]
COPY --from=core-build /app/core /lib
RUN dotnet build "./Service/API/API.csproj" -c Release -o /app/service

# Create final image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=api-build /app/service .
ENTRYPOINT ["dotnet", "API.dll"]
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Проверь контекст из которого запускаешь docker build. Ошибка не связана с Libs - все падает еще на этапе копирования первого проекта

P.S. это последний аргумент (обычно . ставят), например docker build -t sample-image:latest .или
docker build -t sample-image:latest source-directory
Ответ написан
@va_k
COPY ["../Libs/GChain.Core/GChain.Core.csproj", "../Libs/GChain.Core/"]
Уберите .. / в начале путей. У вас из за этого ошибка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы