ASP.NET 5:使用多项目解决方案构建docker

时间:2015-03-05 14:25:26

标签: docker asp.net-core

我正在尝试创建一个由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是在我的Project.json所在的Web Application文件夹中? 当然我已根据此文件的位置对其进行了修改。

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

  

docker build -t quizzcorrector。

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

  

无法找到Models> = 1.0.0

     

无法找到FlashTools> = 1.0.0

     

无法找到QuizzService> = 1.0.0

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

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

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

感谢帮助我

4 个答案:

答案 0 :(得分:25)

更新时间: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. 构建和发布项目
  5. 运行docker build -t QuizzCorrector
  6. 构建Docker镜像

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

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

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

答案 1 :(得分:7)

未来参考&任何人都有同样的问题。 微软发布了一个带有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"]

答案 2 :(得分:3)

为了能够使用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 :(得分:0)

这个答案也许迟到了。

在这篇文章http://dev.widemeadows.de/2015/09/08/fun-with-asp-net-5-beta7-bliss-build-errors-dockerfiles-and-reverse-proxies/中,你要做一个关于解决方案的文件,并参考起始项目来引用所有项目。