docker 集线器很慢

docker hub very slow

我用这个命令创建了一个基本的 asp.net 核心 MVC 项目:

dotnet new mvc --name "myproject"

我创建了这个构建运行时映像的非常基本的 Dockerfile:

FROM  mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /src
COPY . .
RUN dotnet restore "./myproject.csproj"
RUN dotnet build "myproject.csproj" -c Release -o /app
RUN dotnet publish "myproject.csproj" -c Release -o /app

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "myproject.dll"]

我已经设置了一个 github 帐户和一个 docker 中心帐户,以便在每个 commit/push 上构建映像。

建筑大约需要 6 分钟。这很慢。我想知道一个真正更大的项目的结果。

我该怎么做才能加快编译速度?

我的目标是将图像投入生产(CI 管道)。如果我修复了一个错误,我等不了 10 分钟。这是自相矛盾的,因为我曾经使用过一种老派的方法:ftp 传输二进制文件,这需要……30 秒! 我在这个目标的某个地方错了?

谢谢

根据我使用免费服务的经验,这是正常时间。我假设使用 non-free 帐户选项会更快。另一种选择是设置本地构建 server/vm。您可以很容易地 运行 gitlab 容器以及 gitlab-runner 容器。从那里你设置一个 gitlab ci 文件并在本地完成所有这些,然后将图像推送到 Docker Hub。

嗯,一个问题是 dotnet restore 之前的 COPY . .。恢复 NuGet 包可能需要相当长的时间。 Docker 缓存每个图像层(基本上是每个命令)并将再次使用缓存而不是 运行 该命令。但是,如果它之前的任何层发生变化,则必须重建所有后续层。由于 COPY . . 对任何文件的任何更改都会触发该层的重建,因此您每次都被迫重建 dotnet restore 层,这是非常低效的。

执行此操作的正确方法是只复制项目文件,还原,然后复制所有其余文件:

COPY myproject.csproj .
RUN dotnet restore "./myproject.csproj"
COPY . .