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

21
我正在尝试创建一个ASP.NET 5解决方案的图像,它由4个项目组成。以下是结构:
  • FlashTools(ASP.NET 5类库)
  • Models(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 .
我的问题是,在某个时刻,docker告诉我:
无法找到Models>=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 我当然也尝试使用ADDCOPY命令将我的项目内容复制到容器的文件系统中,但仍然出现相同的错误。
谢谢您的帮助。
4个回答

28

更新日期:2018年2月14日

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

  1. Create Dockerfile in the web application folder
  2. Put the following content into it

    FROM microsoft/aspnetcore
    
    COPY ./publish /publish
    WORKDIR /publish
    EXPOSE 5000/tcp
    ENTRYPOINT ["dotnet", "QuizzCorrector.dll"]
    
  3. Build and publish the project by running dotnet publish -c Release -o publish
  4. Build Docker image by running docker build -t QuizzCorrector
请注意,microsoft/aspnetcore Docker镜像是仅运行时镜像,不提供.NET Core SDK,这使其更轻便,更适合生产使用。
对于那些仍在尝试使其工作的人,可能已经有点晚了,但我会回答这个问题。您需要在解决方案级别上创建一个Dockerfile。然后,您需要更新您的工作文件夹以使用您的Web项目所在的文件夹。以下是最终的Dockerfile,考虑到kpmk实用程序已被替换为一个dotnet工具。
FROM microsoft/dotnet:latest

COPY . /app
WORKDIR /app/src/QuizzCorrector
RUN ["dotnet", "restore"]

EXPOSE 5004
ENTRYPOINT ["dotnet", "run"]


9个月后,我终于测试了这种方法,效果非常好。谢谢 :-) - Jérôme MEVEL
谢谢。花了我2天时间才找到这个解决方案。 - zaidorx
如果您的解决方案中有两个项目,并且您希望它们作为两个不同的 Web 应用程序发布,那该怎么办呢?如果您的 Dockerfile 不在解决方案级别上,您能否使其工作?我需要它们在各自的项目中... - Reft
如果您查看 eShopOnContainers 项目中的 Dockerfile,它们位于项目文件夹中,但是在根文件系统上下文中运行,因此对其他项目的路径是相对于该上下文的。在这里采用新方法意味着您必须先构建项目,然后运行 docker-compose build,最后运行 docker-compose up。我曾经使用更新的方法,但后来改变了方式,因为它变得很烦人。 - matt_lethargic
@matt_lethargic 你说得对。Visual Studio为项目生成的Dockerfile不仅可以运行,还可以构建,但也存在一些缺点。每次添加新项目到解决方案时,都应该更新Dockerfile。此外,如果有其他需要运行的步骤,例如npm install,则应手动更新Dockerfile以包含node镜像来执行它。 - Alexey Andrushkevich

9
要在DockerHub中使用ASP.NET CORE 1.0构建和运行多个xprojects,我遇到了类似的问题。这导致我来到这里并得到了帮助。我的解决方案是这样的:
解决方案结构
```

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"]

8

供以后参考和遇到同样问题的人查阅。 微软发布了一个使用docker容器的dotnet core应用示例,即dotnet-architecture/eShopOnContainers项目。可以在此处链接中找到。

你可以参考链接或者下面提供的示例。

示例:

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"]

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接