【问题标题】:asp.net core 2.0 - multiple projects solution docker fileasp.net core 2.0 - 多项目解决方案docker文件
【发布时间】:2018-04-16 15:30:15
【问题描述】:

[asp.net core 2.0 和 docker for linux]

我对 docker 完全陌生,并试图弄清楚如何在我有 2 个项目的解决方案的情况下使用 docker。我见过的所有教程都显示为单个项目。

所以,如果有人可以逐步展示解决方案,我将不胜感激。

我的解决方案结构如下:

Solution.sln
|______WebAPIProject.csproj
|______ClassLibraryProject.csproj

在 Visual Studio 中,我为解决方案添加了 docker 支持并获得了这些文件:

在 WebAPIProject 下,它创建了这个 Docker 文件

FROM microsoft/aspnetcore:2.0
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "WebAPIProject.dll"]

然后,在单独的 docker-compose 'project' 下,我得到了:

docker-compose.ci.build.yml

version: '3'

services:
  ci-build:
    image: microsoft/aspnetcore-build:1.0-2.0
    volumes:
      - .:/src
    working_dir: /src
    command: /bin/bash -c "dotnet restore ./Solution.sln && dotnet publish ./Solution.sln -c Release -o ./obj/Docker/publish"

docker.compose.yml 文件

version: '3'

services:
  WebAPIProject:
    image: WebAPIProject
    build:
      context: ./WebAPIProject
      dockerfile: Dockerfile

我确信它对路径来说是微不足道的,但我对这一切都很迷茫,所以如果有人能对它有所了解吗?

【问题讨论】:

  • 您好,您找到解决方案了吗?对我来说,添加 Docker 支持会在尝试创建映像时导致错误。谢谢

标签: docker asp.net-core


【解决方案1】:

我终于找到了一种使用 docker 构建解决方案的方法。

重要提示:为此,您必须将 Dockerfile 文件放入解决方案文件所在的同一位置

我刚刚创建了一个包含以下内容的 docker 文件:

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY Solution.sln ./
COPY ClassLibraryProject/*.csproj ./ClassLibraryProject/
COPY WebAPIProject/*.csproj ./WebAPIProject/

RUN dotnet restore
COPY . .
WORKDIR /src/ClassLibraryProject
RUN dotnet build -c Release -o /app

WORKDIR /src/WebAPIProject
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

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

请注意,我认为您可能必须尊重项目构建依赖关系,但我真的不知道。

构建调用示例:

sudo docker build --no-cache -t webapi:dev .

运行调用示例:

sudo docker run -d=false -p 8080:80 --name webapi webapi:dev

希望对您有所帮助。

【讨论】:

  • 在 docker build well 我收到此错误 COPY failed: stat /var/lib/docker/tmp/docker-builder953792128/MyProject.sln: no such file or directory ,有什么建议吗?
  • dockerfile和解决方案文件在同一个文件夹吗?
  • 不,是这样的project1.sln, project1folder -> Dockerfile, project1.csproj
  • 这就是docker找不到你的sln文件的原因。这些路径是从 docker 文件位置看到的相对路径。请将 docker 文件复制到解决方案文件夹中。
  • 如果我将 docker 文件移动到解决方案文件夹中 - 然后从 Visual Studio 构建和发布失败。所以这是一个糟糕的解决方案。
【解决方案2】:

虽然我知道 dotnet 核心并非特定于 Windows,也不是每个人都会使用 Visual Studio,但 Microsoft 已经在 Visual Studio 中包含了这个简洁的功能(在 2017 年尝试过)。

  1. 右键单击 Web 项目。
  2. 选择添加。
  3. 然后是“Docker 支持”。这将自动将多个项目提取到容器中。

如果您有多个 Web 项目,请分别为每个项目重复该步骤。

这是参考:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/visual-studio-tools-for-docker?view=aspnetcore-2.1#existing-app

如果您在运行 Docker 容器时碰巧遇到任何问题,请尝试在“Windows 功能”中取消选择 Hyper-V Services(在开始菜单中搜索 Windows Features),再次选择,然后重新启动计算机。 检查here

【讨论】:

  • 不幸的是,当我使用此命令时,我遇到了与此问题类似的错误 - github.com/docker/for-mac/issues/1922
  • 禁用 Hyper-V 功能对我有用。谢谢!
  • 这是一条救命的小窍门。在这个问题上苦苦挣扎了两天。非常感谢。
  • 我不得不将 Dockerfile 拖放到包含 .sln 的同一文件夹中。谢谢!
  • 类库缺少该选项。 :-/
【解决方案3】:

我遇到了同样的问题,所有其他解决方案都不适合我,所以我自己解决了。 我觉得下面的步骤很清晰,但如果你是 Docker 新手,我会在我的 blog post dedicated to new Docker users 中逐行解释(这样你就可以准确地理解这个 Dockerfile 中发生了什么)。

  1. Dockerfile 保留在项目目录中(在我看来,这比将其保留在解决方案文件旁边更好,因为您可以拥有多个每个解决方案一个 Docker 映像)。

  2. 配置Dockerfile如下:

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

COPY . ./
RUN dotnet publish PROJECT_NAME -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY --from=build-env /app/PROJECT_NAME/out .

ENTRYPOINT ["dotnet", "PROJECT_NAME.dll"]
  1. .dockerignore 文件移动到解决方案目录 - 这是必需的,因为 Docker CLI 仅从根目录获取 .dockerignore 文件构建上下文(如documentation says),但它也很方便,因为您有一套适用于所有项目的通用忽略规则(类似于 .gitignore 文件),更易于维护。

  2. 从解决方案目录运行build命令,指向项目目录中的Dockerfile,并将当前目录(.)设置为build上下文(访问所有项目):

docker build -f PROJECT_DIRECTORY/Dockerfile -t IMAGE_NAME .
  1. 照常运行容器,例如:
docker run -d -p 8080:80 --name my-app-name IMAGE_NAME

【讨论】:

  • 第四点正是我需要的!谢谢!就我而言,我通过 VS“添加 Docker 支持”生成了 dockerfile。之后,我只需从我的解决方案目录执行 docker build 命令,指向目标项目的 Dockerfile 路径。
  • tometchy,你真是太棒了,谢谢你的解决方案,我已经尝试过了,它找到了其他 csproj 文件,谢谢!
【解决方案4】:

此链接指向an amazing post,了解如何解决此问题。

他提到将所有代码放在src 目录中。我没有那样做,这是我想出的文件:(关键是 for file 部分。我确定它不是最好的 dockerfile;欢迎提示。)

FROM microsoft/dotnet:2.2-aspnetcore-runtime-stretch-slim AS base
WORKDIR /app
EXPOSE 5000

FROM microsoft/dotnet:2.2-sdk-stretch AS build
WORKDIR /src

COPY ./*.sln ./

COPY */*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done
RUN dotnet restore

COPY . ./
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .

ENV ASPNETCORE_URLS="http://*:5000"
ENTRYPOINT ["dotnet", "PersonalSiteApi.dll"]

【讨论】:

    【解决方案5】:
    FROM microsoft/dotnet:sdk AS build-env
    WORKDIR /app
    
    RUN mkdir /output
    
    # Copy project and publish
    
    COPY . /app
    
    WORKDIR /app/YourProjectName
    RUN dotnet publish --configuration Debug --output /output
    
    # Build runtime image
    FROM microsoft/dotnet:aspnetcore-runtime
    
    ENV ASPNETCORE_URLS http://*:5001
    
    WORKDIR /app
    
    COPY --from=build-env /output .
    EXPOSE 5001
    
    ENTRYPOINT ["dotnet", "YourProjectName.dll"]
    

    这是一个对我有用的 Docker 配置。这是一个包含许多子项目引用的 ASP.NET Core 2 WebApi 项目。

    Then run it using  docker run -d -p 8080:5001 --name some-name yourpojectname
    

    希望这对某人有所帮助。

    【讨论】:

      【解决方案6】:

      截至 2022 年 docker-compose 3.9

      经过几次尝试,我设法做到了:

      项目层次结构:

      MoulaTracker/
      |- MoulaTracker.Core/    # <- PROJECT 1
      |- MoulaTracker.Api/     # <- PROJECT 2
      |- Dockerfile.Core
      |- Dockerfile.Api
      |- docker-compose.yml
      |- MoulaTracker.sln
      

      项目MoulaTracker.Api依赖于MoulaTracker.Core

      docker-compose.yml

      version: "3.9"
      
      services:
        moula-tracker-core:
          build:
            context: .
            dockerfile: ./Dockerfile.Core
        moula-tracker-api:
          build:
            context: .
            dockerfile: ./Dockerfile.Api
      

      Dockerfile.Api

      FROM mcr.microsoft.com/dotnet/core/sdk:3.1.409 AS build-env
      
      # Copy csproj and restore as distinct layers
      WORKDIR /MoulaTracker.Api
      COPY ./MoulaTracker.Api .
      COPY ./MoulaTracker.Core ../MoulaTracker.Core
      RUN dotnet restore
      
      RUN dotnet publish -c Release -o out
      
      # Build runtime image
      FROM mcr.microsoft.com/dotnet/core/aspnet:3.1.0 AS runtime
      
      WORKDIR /MoulaTracker.Api
      COPY --from=build-env /MoulaTracker.Api/ ./
      
      ENTRYPOINT ["dotnet", "out/MoulaTracker.Api.dll"]
      

      【讨论】:

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