Docker 映像在 Windows/MVC 核心上构建的速度很慢

Posted

技术标签:

【中文标题】Docker 映像在 Windows/MVC 核心上构建的速度很慢【英文标题】:Docker Images Are Being Slow to Build on Windows/MVC Core 【发布时间】:2020-05-14 18:43:17 【问题描述】:

我有一个 MVC Core 2.2,在 docker 容器中有多个项目。当我运行它时,构建图像和启动容器大约需要 4 分钟。我正在使用docker-compose

这似乎很慢,因为这是一个小型开发,而且我有一台不错的计算机。似乎资源没有被使用,因为在图像构建期间处理器低于 8%,ram 不移动,磁盘几乎为 0%。显卡 0%。下载 Microsoft 映像时,我可以看到几秒钟的互联网飙升,但仅此而已。我给 docker 提供了以下资源:

Cores: 8
RAM: 8GB
SWAP: 3gb
Disk Image Size: 64GB (30.5 GB used)

您知道如何使用这些硬件资源加快构建速度吗?

【问题讨论】:

您使用的是 Windows 还是 Linux Core Base-Images? 我在 Windows 10 机器上使用基于 Linux 的映像 所以 Linux 容器不会在 Windows 10 下原生运行,Docker for Windows 会为此创建一个特殊的 VM,也许这会导致延迟。它存在一个实验性功能,但仍在开发中,请参阅github.com/moby/moby/issues/33850 【参考方案1】:

这似乎是 Windows 10 上 Docker 的一个普遍问题,因为我在网上找到了几个讨论这个问题的线程,而且它似乎通常与分配给 Docker 的硬件资源无关。

所以我在我的 Windows 10 虚拟实例上做了一些尝试,并注意到使用示例 docker-compose 运行一些基于 Linux 的容器的类似行为。

在这里,我报告了我在搜索过程中发现的所有步骤,这些步骤似乎确实加快了我的测试过程中的操作:

    在以下位置添加开发(例如 git repos)和 docker 映像目录:

    Windows Defender 排除列表 (https://support.microsoft.com/en-us/help/4028485/windows-10-add-an-exclusion-to-windows-defender-antivirus)

    注意:这里首先尝试禁用 Windows Defender 看看是否有帮助

    Windows 索引排除列表(控制面板 -> 索引选项)

    执行以下命令刷新 dns:

    ipconfig /flushdns
    

    尝试将 DNS 更改为例如谷歌一(8.8.8.8 - 8.8.4.4)或云票价一(1.1.1.1 - 1.0.0.1)(这里,因为我已经有了谷歌DNS,我试过了以相反的方式设置一个较慢的 DNS 和真正的操作变得有点慢)

    如果安装了任何其他防病毒软件,则添加例外(也在这里先尝试禁用它们,看看是否有帮助)

    从所有网络接口中删除所有 IPV6 支持和 NetBios

注意:有人建议卸载 Docker 并在这些适用之后安装,但我没有测试,因为我是从全新的 Windows 10 安装开始的。

希望这些对您的环境也有帮助!

我找到的最佳参考:

https://github.com/docker/for-win/issues/1936 https://forums.docker.com/t/docker-for-windows-very-slow-networking-host-directory-as-a-volume/25758

【讨论】:

【参考方案2】:

检查构建目录是否有太多文件,如果有dcoker需要将所有文件发送到守护进程,这也需要时间来完成......

您可以使用.dockerignore 忽略不需要的文件

在 docker CLI 将上下文发送到 docker 守护进程之前,它看起来 对于上下文根目录中名为 .dockerignore 的文件。 如果此文件存在,CLI 会修改上下文以排除文件并 与其中的模式匹配的目录。这有助于避免 不必要地将大型或敏感文件和目录发送到 daemon 并可能使用 ADD 或 COPY 将它们添加到图像中。

【讨论】:

对 node js 项目特别重要,因为 node_modules 文件夹的大小【参考方案3】:

由于包含了额外的文件,我最近发生了这种情况。就我而言,该项目缺少 Microsoft.VisualStudio.Azure.Containers.Tools.Targets 包和 .dockerignore,但 proj 文件确实有

<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerfileContext>..\..</DockerfileContext>

...元素。我的目录结构通常是

c:\Dev  (all repos are in here - more than 100)
      \ThisProjectRepo
                      \Solution.sln
                      \ProjectToBuild
                                     \ProjectToBuild.csproj

它创建的图像包含 c:\Dev 文件夹的全部内容。我的猜测是,如果没有容器工具的目标包,VS 将使用解决方案的文件夹而不是项目文件夹作为 docker 构建的起点,然后向上两个目录开始包含文件。

【讨论】:

以上是关于Docker 映像在 Windows/MVC 核心上构建的速度很慢的主要内容,如果未能解决你的问题,请参考以下文章

云计算核心技术Docker教程:Docker存储写入时复制(CoW)策略

如何安装在 windowsservercore Docker 映像上执行本机 C++ DLL/EXE 所需的所有依赖二进制文件

关于Docker中的Images与Containers

在 docker 上运行的 asp.net 核心未正确编码拉丁字符

Docker入门系列之四:Docker映像

在构建 Docker 映像时要求安装 Typescript