Несколько. NET проектов в одном docker изображении - PullRequest
0 голосов
/ 12 марта 2020

Структура моего проекта выглядит следующим образом:

-Solution
 -docker-compose.yml
 -MainProject.csproj
   -Dockerfile
   -Database
     -Dockerfile
 -Microsoft.Identity.Web.csproj

MainProject зависит от Microsoft.Identity.Web. Я хочу иметь возможность запускать docker-compose up --build, и это должно создать мой MainProject и базу данных, которые связаны друг с другом, это работает в моем текущем решении. Что не работает, так это когда я добавляю ссылку на Microsoft.Identity.Web, поскольку Dockerfile для MainProject не включает это в сборку.

Вот мой Dockerfile и docker -compose:

Dockerfile

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

# Copy everything else and build
COPY . ./
RUN dotnet restore MainProject/*.csproj
RUN dotnet publish MainProject/*.csproj -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .

EXPOSE 80

ENTRYPOINT ["dotnet", "MainProject.dll"]

docker -compose

version: "3.7"
services:
  dotnet-backend:
    container_name: dotnet-backend
    build: ./MainProject/
    env_file: .env
    links:
      - mssql-db
    ports:
      - "8000:80"
  mssql-db:
    container_name: mssql-db
    build: ./MainProject/Database
    volumes:
     - ./Database/:/scripts/
    ports:
      - "1433:1433"

Я пробовал несколько решений, предложенных на разных форумах, но ничего не помогло. Некоторые решения предлагают переместить Dockerfile на уровень решения, но я бы хотел этого избежать. У кого-нибудь есть Dockerfile, который я могу использовать для включения ссылок на другие проекты в том же решении? Это должно быть совместимо с использованием docker -compose up --build.

РЕДАКТИРОВАТЬ: Эта статья: https://www.softwaredeveloper.blog/multi-project-dotnet-core-solution-in-docker-image#solution хорошо подводит итог того, что я хочу достичь, но решение неполный для меня. Он предлагает запустить docker build -f PROJECT_DIRECTORY/Dockerfile -t IMAGE_NAME . с уровня решения, что, очевидно, установит контекст сборки на уровень решения. Однако я не уверен, как это преобразуется в docker -компонентный файл. Я попытался поместить docker -compose на уровне решения и Dockerfile на уровне проекта, но запуск docker-compose up --build все еще дает мне эту ошибку:

/usr/share/dotnet/sdk/3.1.102/Microsoft.Common.CurrentVersion.targets(1875,5): warning : The referenced project '../../Users/me/source/repos/active-directory-aspnetcore-webapp-openidconnect-v2/Microsoft.Identity.Web/Microsoft.Identity.Web.csproj' does not exist. [/app/MainProject.csproj]
Startup.cs(11,17): error CS0234: The type or namespace name 'Identity' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?) [/app/MainProject.csproj]
Startup.cs(12,17): error CS0234: The type or namespace name 'Identity' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?) [/app/MainProject.csproj]
ERROR: Service 'dotnet-backend' failed to build: The command '/bin/sh -c dotnet publish *.csproj -c Release -o out' returned a non-zero code: 1
...