Структура моего проекта выглядит следующим образом:
-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