Windows 上运行 Docker 步骤缓慢,为什么?

14

我正在尝试使用以下 dockerfile 创建一个新的docker镜像,但其中一步骤需要很长时间才能完成:

FROM microsoft/dotnet-framework:4.7

SHELL ["powershell"]

# Note: Get MSBuild 12.
RUN Invoke-WebRequest "https://download.microsoft.com/download/9/B/B/9BB1309E-1A8F-4A47-A6C5-ECF76672A3B3/BuildTools_Full.exe" -OutFile "$env:TEMP\BuildTools_Full.exe" -UseBasicParsing
RUN &  "$env:TEMP\BuildTools_Full.exe" /Silent /Full
# Todo: delete the BuildTools_Full.exe file in this layer

# Note: Add .NET 
## RUN Install-WindowsFeature NET-Framework-45-Features ; \

# Note: Add NuGet
RUN Invoke-WebRequest "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -OutFile "C:\windows\nuget.exe" -UseBasicParsing
WORKDIR "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0"

# Note: Add Msbuild to path
RUN setx PATH '%PATH%;C:\\Program Files (x86)\\MSBuild\\12.0\\Bin\\msbuild.exe'
CMD ["C:\\Program Files (x86)\\MSBuild\\12.0\\Bin\\msbuild.exe"]

到目前为止,以下是输出结果:

PS C:\MyWorkspace\images\msbuild> docker build -t msbuild .
Sending build context to Docker daemon   2.56kB
Step 1/9 : FROM microsoft/dotnet-framework:4.7
 ---> 91abbfdc50cb
Step 2/9 : MAINTAINER mohamed.elkammar@gmail.com
 ---> Using cache
 ---> fbf720101007
Step 3/9 : SHELL powershell
 ---> Using cache
 ---> 642cf0e08730
Step 4/9 : RUN Invoke-WebRequest "https://download.microsoft.com/download/9/B/B/9BB1309E-1A8F-4A47-A6C5-ECF76672A3B3/BuildTools_Full.exe" -OutFile "$env:TEMP\BuildTools_Full.exe" -UseBasicParsing
 ---> Using cache
 ---> a722c88fee0f
Step 5/9 : RUN &  "$env:TEMP\BuildTools_Full.exe" /Silent /Full
 ---> Using cache
 ---> 4fda7448f2e4
Step 6/9 : RUN Invoke-WebRequest "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -OutFile "C:\windows\nuget.exe" -UseBasicParsing
 ---> Running in eec036874574

此外,以下是 docker info 的输出结果:
C:\Windows\system32>docker info
Containers: 2
 Running: 1
 Paused: 0
 Stopped: 1
Images: 5
Server Version: 17.06.1-ee-2
Storage Driver: windowsfilter
 Windows:
Logging Driver: json-file
Plugins:
 Volume: local
 Network: l2bridge l2tunnel nat null overlay transparent
 Log: awslogs etwlogs fluentd json-file logentries splunk syslog
Swarm: inactive
Default Isolation: process
Kernel Version: 10.0 14393 (14393.1715.amd64fre.rs1_release_inmarket.170906-1810)
Operating System: Windows Server 2016 Datacenter
OSType: windows
Architecture: x86_64
CPUs: 1
Total Memory: 4.75GiB
Name: instance-1
ID: B2BG:6AW5:Y32S:YLIO:FE25:WWDO:ZAGQ:CZ3M:S5XM:LSHB:U5GM:VYEM
Docker Root Dir: C:\ProgramData\docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

什么会导致简单的下载步骤变得非常缓慢?

4
我有相同的问题,你发现了什么吗? - Alberto Monteiro
你的问题也和NuGet有关吗? - mbadawi23
我必须等待荒谬的时间。如果您需要等待任务完成,尝试在命令后使用“| Out-Null”。 - mbadawi23
我只是在运行这个命令:docker run -it microsoft/dotnet-framework - Alberto Monteiro
我以前在运行node下的browserify时遇到过这个问题,但是通过增加docker配置中分配给docker的内存量来修复了它。也许值得一试。 - Richie Mackay
显示剩余4条评论
2个回答

1
我曾经遇到过类似Docker和Windows的问题。尝试了以下选项:
  1. 检查DNS是否太慢。我用8.8.8.8替换了/etc/resolve.conf中的几个nameserver条目,并进行了强制重新加载。这有助于减少加载时间。

  2. 检查docker是否通过IPv6连接到dockerd;在我的情况下,它不是监听器。禁用网络接口上的IPv6并重新启动机器有助于减少加载时间。


0

一个Docker构建过程需要比运行容器更长的时间。它也取决于Docker是否有缓存。

因此,通常情况下,第一次构建容器时没有缓存,所以需要最长的时间,然后在后续的Docker构建中,如果缓存可用,Docker引擎会使用缓存。构建完成后,运行容器时速度更快。

在构建时,特别是第一次构建时,Docker将从公共注册表中获取microsoft/dotnet-framework:4.7,除非已经拉取并在本地的Docker镜像中可用。如果它可用,Docker引擎将使用它,否则它将从远程仓库放置。如果您有本地副本,它会更快。如果您希望,在构建之前可以拉取它或者将其放入本地私有注册表中,并将标签更改为您的注册表URL。

哪个步骤很慢?那个正在获取nuget.exe的最后一步吗?如果是,请首先考虑名称解析、DNS、防火墙或到达互联网的网络超时等问题。

尝试运行此容器以检查名称解析,并查看它是否可以快速获取该文件。

FROM centos

维护者 Blake Russo

RUN yum install -y dig wget bind-utils nc ; dig -x dist.nuget.org; nslookup dist.nuget.org; wget dist.nuget.org/win-x86-commandline/latest/nuget.exe; ls -la nug*;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接