ASP.NET 5: docker 使用多项目解决方案构建
ASP.NET 5: docker build with multi-projects solution
我正在尝试创建由 4 个项目组成的 ASP.NET 5 解决方案的图像。这是结构:
- FlashTools(ASP.NET 5 class 库)
- 模型(ASP.NET 5 class 库)
- QuizzCorrector(ASP.NET 5 Web 应用程序)
- 测验服务(ASP.NET 5 class 库)
我有一个简单的 Dockerfile,如下所示:
FROM microsoft/aspnet
COPY . /app
WORKDIR /app
RUN ["kpm", "restore"]
EXPOSE 5004
ENTRYPOINT ["k", "kestrel"]
但不确定放在哪里。在 global.json 所在的解决方案的根文件夹中,或者在我的 project.json 所在的 Web 应用程序文件夹中?
当然,我已经根据这个文件所在的位置对其进行了修改。
无论如何,两者似乎都有效,因为当我 运行 命令
时,它会下载我需要的所有库
docker build -t quizzcorrector .
我的问题现在docker告诉我
Unable to locate Models >= 1.0.0
Unable to locate FlashTools >= 1.0.0
Unable to locate 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 中使用 ADD 或 COPY 命令将我的项目内容复制到容器的文件系统,但仍然是同样的错误。
谢谢你帮助我
更新时间:2018 年 2 月 14 日
我之前的回答没有考虑编写 Docker 文件的最佳实践。它也不适用于那些有多个 Web 项目的解决方案,其中每个应用程序必须 运行 在单独的 Docker 容器中。更好的方法是在开发环境中构建和发布 ASP.NET 核心应用程序,并在针对生产使用优化的 Docker 容器中 运行 应用程序。
- 在 Web 应用程序文件夹中创建 Docker 文件
将以下内容放入其中
FROM microsoft/aspnetcore
COPY ./publish /publish
WORKDIR /publish
EXPOSE 5000/tcp
ENTRYPOINT ["dotnet", "QuizzCorrector.dll"]
- 构建并发布项目 运行ning
dotnet publish -c Release -o publish
- 构建 Docker 图像 运行ning
docker build -t QuizzCorrector
请注意,microsoft/aspnetcore
Docker 图像是 运行 仅时间图像,它不提供 .NET Core SDK,这使得它更轻便,更适合生产使用。
可能来晚了,但我会为那些仍在努力让它工作的人回答这个问题。您需要在解决方案级别创建一个 Docker 文件。然后您需要更新您的工作文件夹以使用您的 Web 项目所在的文件夹。下面是最终的 Docker 文件,考虑到 kpm
和 k
实用程序被替换为一个 dotnet
工具。
FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app/src/QuizzCorrector
RUN ["dotnet", "restore"]
EXPOSE 5004
ENTRYPOINT ["dotnet", "run"]
也许这个答案还不晚。
在此 post http://dev.widemeadows.de/2015/09/08/fun-with-asp-net-5-beta7-bliss-build-errors-dockerfiles-and-reverse-proxies/ 中,您必须在解决方案中创建一个文件,并通过引用起始项目来引用所有项目。
为了能够使用 ASP.NET CORE 1.0 在 DockerHub 中构建和 运行 多个 xprojects 我遇到了与此类似的问题。这把我带到这里并帮助了我。我的解决方案是:
解决方案结构
```
Root
│ AuthenticationService.sln
│ Dockerfile
│
└───src
│ │
│ └───AuthenticationService
│ └───DataAccess
│ └───EntityDataModels
│ └───Services
.
Docker 文件:
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"]
供将来参考和遇到相同问题的任何人使用。
Microsoft 发布了带有 docker 个容器 dotnet-architecture/eShopOnContainers 项目 here
的示例 dotnet 核心应用程序
您可以参考link或找到下面的例子
示例:
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 个项目组成的 ASP.NET 5 解决方案的图像。这是结构:
- FlashTools(ASP.NET 5 class 库)
- 模型(ASP.NET 5 class 库)
- QuizzCorrector(ASP.NET 5 Web 应用程序)
- 测验服务(ASP.NET 5 class 库)
我有一个简单的 Dockerfile,如下所示:
FROM microsoft/aspnet
COPY . /app
WORKDIR /app
RUN ["kpm", "restore"]
EXPOSE 5004
ENTRYPOINT ["k", "kestrel"]
但不确定放在哪里。在 global.json 所在的解决方案的根文件夹中,或者在我的 project.json 所在的 Web 应用程序文件夹中? 当然,我已经根据这个文件所在的位置对其进行了修改。
无论如何,两者似乎都有效,因为当我 运行 命令
时,它会下载我需要的所有库docker build -t quizzcorrector .
我的问题现在docker告诉我
Unable to locate Models >= 1.0.0
Unable to locate FlashTools >= 1.0.0
Unable to locate 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 中使用 ADD 或 COPY 命令将我的项目内容复制到容器的文件系统,但仍然是同样的错误。
谢谢你帮助我
更新时间:2018 年 2 月 14 日
我之前的回答没有考虑编写 Docker 文件的最佳实践。它也不适用于那些有多个 Web 项目的解决方案,其中每个应用程序必须 运行 在单独的 Docker 容器中。更好的方法是在开发环境中构建和发布 ASP.NET 核心应用程序,并在针对生产使用优化的 Docker 容器中 运行 应用程序。
- 在 Web 应用程序文件夹中创建 Docker 文件
将以下内容放入其中
FROM microsoft/aspnetcore COPY ./publish /publish WORKDIR /publish EXPOSE 5000/tcp ENTRYPOINT ["dotnet", "QuizzCorrector.dll"]
- 构建并发布项目 运行ning
dotnet publish -c Release -o publish
- 构建 Docker 图像 运行ning
docker build -t QuizzCorrector
请注意,microsoft/aspnetcore
Docker 图像是 运行 仅时间图像,它不提供 .NET Core SDK,这使得它更轻便,更适合生产使用。
可能来晚了,但我会为那些仍在努力让它工作的人回答这个问题。您需要在解决方案级别创建一个 Docker 文件。然后您需要更新您的工作文件夹以使用您的 Web 项目所在的文件夹。下面是最终的 Docker 文件,考虑到 kpm
和 k
实用程序被替换为一个 dotnet
工具。
FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app/src/QuizzCorrector
RUN ["dotnet", "restore"]
EXPOSE 5004
ENTRYPOINT ["dotnet", "run"]
也许这个答案还不晚。
在此 post http://dev.widemeadows.de/2015/09/08/fun-with-asp-net-5-beta7-bliss-build-errors-dockerfiles-and-reverse-proxies/ 中,您必须在解决方案中创建一个文件,并通过引用起始项目来引用所有项目。
为了能够使用 ASP.NET CORE 1.0 在 DockerHub 中构建和 运行 多个 xprojects 我遇到了与此类似的问题。这把我带到这里并帮助了我。我的解决方案是:
解决方案结构
```
Root
│ AuthenticationService.sln
│ Dockerfile
│
└───src
│ │
│ └───AuthenticationService
│ └───DataAccess
│ └───EntityDataModels
│ └───Services
.
Docker 文件:
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"]
供将来参考和遇到相同问题的任何人使用。 Microsoft 发布了带有 docker 个容器 dotnet-architecture/eShopOnContainers 项目 here
的示例 dotnet 核心应用程序您可以参考link或找到下面的例子
示例:
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"]