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 . .
我用这个命令创建了一个基本的 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 . .