【问题标题】:Dockerize .NET solution with 2 executable projects带有 2 个可执行项目的 Dockerize .NET 解决方案
【发布时间】:2019-12-08 12:44:35
【问题描述】:

我被要求创建一个带有 web api 和控制台程序的 .net 解决方案,然后使用包含完整环境的 docker-compose 命令提供此解决方案。 web api 使用的是 mongodb 和 easynetq。控制台程序引用了 web api 项目,也使用了 easynetq。我知道 Visual Studio 可以为每个项目提供一个 dockerfile。在此之后我该如何进行?我是否在解决方案级别将 2 个 dockerfile 合并为 1 个?或者我可以继续使用 2 个 dockerfile 吗?

控制台程序的Dockerfile

FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app
COPY . ./
RUN dotnet restore "./ConsoleProgram.csproj"
RUN dotnet publish "ConsoleProgram.csproj" -c Release -o out
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "ConsoleProgram.dll"]

webapi 的 Dockerfile 与上面相同,只是名称有所改变

解决方案级别的 Docker 组合

version: '3'

services:

mongo:
  image: mongo
  restart: always
  ports:
    - 27017:27017

webapi:
  build: ./webapi
  restart: always
  ports:
    - 5000:80
  environment:
    MongoDB__Host: mongo
  depends_on:
    - mongo

console:
  build: ./console
  restart: always
  depends_on:
    - webapi

在对此进行 docker compose 后,我收到以下错误:

跳过项目“C:\WebApi\WebApi.csproj”,因为找不到它。 引用的项目 '..\WebApi\WebApi.csproj' 不存在。 服务“控制台”构建失败:命令“cmd /S /C dotnet” publish "Console.csproj" -c Release -o out' 返回一个非零代码: 1

【问题讨论】:

    标签: docker asp.net-core asp.net-web-api docker-compose dockerfile


    【解决方案1】:

    你是在正确的方式。您应该为每个项目(在项目文件夹的根目录中)拥有 Dockerfile,然后是一个文件 docker-compose.yaml 和许多 docker-compose.override.yaml 如果你需要的话。

    Dockerfile 中存在一些差距。

    1.不要复制COPY . ./ConsoleProgram镜像中的所有文件,先复制csproj

    COPY console/ConsoleProgram.csproj console/
    

    2.复制csproj文件后运行dotnet restore以缩短图像构建时间

    RUN dotnet restore console/ConsoleProgram.csproj
    

    3.然后复制所有其他文件并运行带有标志--no-restore的dotnet publish(或build)

    COPY console/ console/
    RUN dotnet publish console/ConsoleProgram.csproj --no-restore -c Release -o /out
    

    以下是 Dockerfile 的一些示例

    FROM microsoft/dotnet:2.2-sdk AS publish
    WORKDIR /src
    
    COPY console/ConsoleProgram.csproj console/
    
    RUN dotnet restore console/ConsoleProgram.csproj
    
    COPY console/ console/
    
    RUN dotnet publish console/ConsoleProgram.csproj --no-restore -c Release -o /app
    
    FROM microsoft/dotnet:2.2-aspnetcore-runtime AS runtime
    WORKDIR /app
    COPY --from=publish /app .
    
    ENTRYPOINT ["dotnet", "ConsoleProgram.dll"]
    

    类似的东西应该适用于 WebAPI。现在看看你的 docker-compose.yaml。您应该指定构建上下文和图像名称

    webapi:
      image: 'webapi'
      build: 
        context: .
        dockerfile: ./webapi/Dockerfile
      restart: always
      ports:
        - 5000:80
      environment:
        MongoDB__Host: mongo
      depends_on:
        - mongo
    
    console:
      image: 'console'
      build: 
        context: .
        dockerfile: ./console/Dockerfile
      restart: always
      depends_on:
        - webapi
    

    由于我不知道您的项目结构,因此您需要注意此答案中的所有项目路径

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多