我的项目结构如下:
-Solution
-docker-compose.yml
-MainProject.csproj
-Dockerfile
-Database
-Dockerfile
-Microsoft.Identity.Web.csproj
MainProject依赖于Microsoft.Identity.Web。我想要的是能够运行docker-compose up --build
,并且这应该构建链接在一起的MainProject和Database,这在我当前的解决方案中有效。当我添加对Microsoft.Identity.Web的引用时,这是行不通的,因为MainProject的Dockerfile在构建中不包括此引用。
这是我的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-compose文件。我尝试将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