【发布时间】:2020-01-08 05:05:58
【问题描述】:
我有一个 .NET Core 解决方案,其中包含 6 个可运行的应用程序 (API) 和多个 netstandard 项目。在 Azure DevOps 上的构建管道中,我需要创建 6 个 Docker 映像并将它们推送到 Azure Registry。
现在我所做的是逐个映像构建,这 6 个 Dockerfile 中的每一个都从头开始构建解决方案(恢复、构建、发布)。这需要几分钟,整个管道几乎需要 30 分钟。
我的目标是优化构建时间。我想出了两种可能的并行方式:
- 删除恢复和构建,运行只是发布(因为它恢复引用并执行与构建相同的操作)
- 发布一次代码(适用于所有可运行的应用程序)并在 Dockerfiles 中复制二进制文件,无需再次构建
这两种方法都可行吗?我不知道如何使第二个工作 - 我是否应该为每个可运行的应用程序运行 dotnet publish,然后使用二进制文件收集文件夹中的所有 Dockerfile 并运行 docker build?我担心的是 - 我需要将所需的 .dll 文件复制到图像中,但是如何在不明确指定的情况下选择哪些文件?
编辑:
我正在使用 Linux 容器。我不编写我的 Dockerfile - 它们是由 Visual Studio 自动生成的。我给你举一个例子:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["Application.WebAPI/Application.WebAPI.csproj", "Application.WebAPI/"]
COPY ["Processing.Dependency/Processing.Dependency.csproj", "Processing.Dependency/"]
COPY ["Processing.QueryHandling/Processing.QueryHandling.csproj", "Processing.QueryHandling/"]
COPY ["Model.ViewModels/Model.ViewModels.csproj", "Model.ViewModels/"]
COPY ["Core.Infrastructure/Core.Infrastructure.csproj", "Core.Infrastructure/"]
COPY ["Model.Values/Model.Values.csproj", "Model.Values/"]
COPY ["Sql.Business/Sql.Business.csproj", "Sql.Business/"]
COPY ["Model.Events/Model.Events.csproj", "Model.Events/"]
COPY ["Model.Messages/Model.Messages.csproj", "Model.Messages/"]
COPY ["Model.Commands/Model.Commands.csproj", "Model.Commands/"]
COPY ["Sql.Common/Sql.Common.csproj", "Sql.Common/"]
COPY ["Model.Business/Model.Business.csproj", "Model.Business/"]
COPY ["Processing.MessageBus/Processing.MessageBus.csproj", "Processing.MessageBus/"]
COPY ["Processing.CommandHandling/Processing.CommandHandling.csproj", "Processing.CommandHandling/"]
COPY ["Processing.EventHandling/Processing.EventHandling.csproj", "Processing.EventHandling/"]
COPY ["Sql.System/Sql.System.csproj", "Sql.System/"]
COPY ["Application.Common/Application.Common.csproj", "Application.Common/"]
RUN dotnet restore "Application.WebAPI/Application.WebAPI.csproj"
COPY . .
WORKDIR "/src/Application.WebAPI"
RUN dotnet build "Application.WebAPI.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "Application.WebAPI.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Application.WebApi.dll"]
还有一件事 - 问题是 azure devops 有这个构建映像的作业,我只是复制了这个作业 6 次,将每个副本指向其他 Dockerfile。这就是他们不重用代码的原因——我很想改变它,使它们基于相同的二进制文件。以下是 Azure DevOps 中的步骤:
- 获取来源
- 构建并推送映像编号。 1
- 构建并推送映像编号。 2
- 构建并推送映像编号。 3
- 构建并推送映像编号。 4
- 构建并推送映像编号。 5
- 构建并推送映像编号。 6
每个“构建和推送映像”都会:
- dotnet 恢复
- dotnet 构建
- dotnet 发布
我想摆脱这种开销 - 有可能吗?
【问题讨论】:
-
你看过andrewlock.net/…吗?
-
您是否为这种情况找到了一个好的解决方案?我有一个非常相似的问题。
-
很遗憾我没有这样做,因为这需要一些我们当时没有的额外时间。
标签: docker asp.net-core azure-devops dotnet-cli