【问题标题】:ASP.NET 5: docker build with multi-projects solutionASP.NET 5:使用多项目解决方案构建 docker
【发布时间】:2015-05-06 22:58:16
【问题描述】:

我正在尝试创建由 4 个项目组成的 ASP.NET 5 解决方案的图像。这是结构:

  • FlashTools(ASP.NET 5 类库)
  • 模型(ASP.NET 5 类库)
  • QuizzCorrector(ASP.NET 5 Web 应用程序)
  • QuizzService(ASP.NET 5 类库)

我有一个简单的 Dockerfile,如下所示:

FROM microsoft/aspnet

COPY . /app
WORKDIR /app
RUN ["kpm", "restore"]

EXPOSE 5004
ENTRYPOINT ["k", "kestrel"]

但不知道放在哪里。在我的解决方案的根文件夹中 global.json 或我的 web 应用程序文件夹中我的 project.json 是? 当然,我已经根据该文件所在的位置对其进行了修改。

无论如何,两者似乎都可以工作,因为它会在我运行命令时下载我需要的所有库

docker build -t quizzcorrector .

我的问题是码头工人告诉我的那一刻

无法找到模型 >= 1.0.0

找不到 FlashTools >= 1.0.0

无法找到 QuizzService >= 1.0.0

我在此线程 https://github.com/aspnet/aspnet-docker/issues/19 上看到,在多项目解决方案中,我们应该运行命令“kpm pack”将我的应用打包成可部署和可运行的形式。

我找不到任何使用 kpm pack 命令的 Dockerfile 示例,只有文档:https://github.com/aspnet/Home/wiki/Package-Manager

我当然也尝试过在我的 Dockerfile 中使用 ADDCOPY 命令将我的项目内容复制到容器的文件系统中,但仍然是同样的错误。

谢谢你的帮助

【问题讨论】:

    标签: docker asp.net-core


    【解决方案1】:

    更新日期:2018 年 2 月 14 日

    我之前的回答没有考虑编写 Dockerfile 的最佳实践。它也不适用于具有多个 Web 项目的解决方案,其中每个应用程序必须在单独的 Docker 容器中运行。更好的方法是在开发环境中构建和发布 ASP.NET Core 应用程序,并在针对生产使用进行了优化的 Docker 容器中运行该应用程序。

    1. 在 Web 应用程序文件夹中创建 Dockerfile
    2. 将以下内容放入其中

      FROM microsoft/aspnetcore
      
      COPY ./publish /publish
      WORKDIR /publish
      EXPOSE 5000/tcp
      ENTRYPOINT ["dotnet", "QuizzCorrector.dll"]
      
    3. 通过运行dotnet publish -c Release -o publish 构建和发布项目
    4. 通过运行docker build -t QuizzCorrector 构建 Docker 映像

    请注意,microsoft/aspnetcore Docker 映像是仅运行时映像,它不提供 .NET Core SDK,这使它更轻巧且更适合生产使用。


    可能已经晚了,但我将为那些仍在努力让它工作的人回答这个问题。您需要在解决方案级别创建 Dockerfile。然后您需要更新您的工作文件夹以使用您的 Web 项目所在的文件夹。考虑到kpmk 实用程序已被一个dotnet 工具替换,这是最终Dockerfile 的下方。

    FROM microsoft/dotnet:latest
    
    COPY . /app
    WORKDIR /app/src/QuizzCorrector
    RUN ["dotnet", "restore"]
    
    EXPOSE 5004
    ENTRYPOINT ["dotnet", "run"]
    

    【讨论】:

    • 9个月后,我终于测试了这个方法,效果很好。谢谢:-)
    • 谢谢。花了 2 天时间才找到这个解决方案。
    • 如果您的解决方案中有两个项目,并且希望将它们发布为两个不同的 Web 应用程序,该怎么办。如果您的 dockerfile 不在解决方案级别,您可以让它工作吗?我需要他们参与各自的项目......
    • 如果您查看 eShopOnContainers 项目中的 eDockerfile,它们位于 porject 文件夹中,但随后使用根文件系统上下文运行,因此其他项目的路径与该上下文相关。在这里以新方式执行此操作意味着您必须构建项目然后运行 ​​docker-compose build 然后运行 ​​docker-compose up。我以前在这里用更新的方式来做,但后来因为烦人而改变了。
    • @matt_lethargic 你是对的。 Visual Studio 为项目生成的Dockerfile 不仅可以运行,还可以构建,但也有一些缺点。每次将新项目添加到解决方案时,Dockerfile 都应该更新。此外,如果还有其他步骤需要运行,例如 npm install - 您应该手动更新 Dockerfile 以包含 node 图像来为您完成。
    【解决方案2】:

    为了能够使用 ASP.NET CORE 1.0 在 DockerHub 中构建和运行多个 xproject,我遇到了与此类似的问题。这导致我来到这里并帮助了我。我的解决方案是这样的:

    解决方案结构

    ```
    
    Root
    │   AuthenticationService.sln
    │   Dockerfile    
    │
    └───src
    │   │
    │   └───AuthenticationService
    │   └───DataAccess
    │   └───EntityDataModels
    │   └───Services
    .
    

    Dockerfile:

    FROM microsoft/dotnet:latest
    COPY . /app
    WORKDIR /app/src/AuthenticationService
    RUN ["dotnet", "restore"]
    
    WORKDIR /app/src/DataAccess
    RUN ["dotnet", "restore"]
    
    WORKDIR /app/src/EntityDataModels
    RUN ["dotnet", "restore"]
    
    WORKDIR /app/src/Services
    RUN ["dotnet", "restore"]
    
    WORKDIR /app/src/AuthenticationService
    RUN ["dotnet", "build"]
    
    EXPOSE 5000/tcp
    ENV ASPNETCORE_URLS http://*:5000
    
    ENTRYPOINT ["dotnet", "run"]
    

    【讨论】:

      【解决方案3】:

      供将来参考和遇到相同问题的任何人。 微软发布了一个带有 docker 容器的示例 dotnet 核心应用程序 dotnet-architecture/eShopOnContainers Project here

      您可以参考链接或找到下面的示例

      例子:

      FROM microsoft/aspnetcore:2.0.3 AS base
      WORKDIR /app
      EXPOSE 80
      
      FROM microsoft/aspnetcore-build:2.0 AS build
      WORKDIR /src
      COPY . .
      RUN dotnet restore -nowarn:msb3202,nu1503
      WORKDIR /src/src/Services/Basket/Basket.API
      RUN dotnet build --no-restore -c Release -o /app
      
      FROM build AS publish
      RUN dotnet publish --no-restore -c Release -o /app
      
      FROM base AS final
      WORKDIR /app
      COPY --from=publish /app .
      ENTRYPOINT ["dotnet", "Basket.API.dll"]
      

      【讨论】:

        【解决方案4】:

        也许这个答案还不晚。

        在这篇http://dev.widemeadows.de/2015/09/08/fun-with-asp-net-5-beta7-bliss-build-errors-dockerfiles-and-reverse-proxies/ 的帖子中,您必须在解决方案中创建一个文件,并通过引用起始项目来引用所有项目。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          • 2011-06-07
          • 1970-01-01
          • 2018-09-18
          • 2023-03-17
          • 2016-12-06
          相关资源
          最近更新 更多