Замедленный докер в Windows Run Step, Why?

Я пытаюсь создать новое изображение докеры со следующим dockerfile, но для завершения одного из шагов потребуется очень много времени:

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 [email protected]
 ---> 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

Что может заставить простой шаг загрузки навсегда?

Ответ 1

У меня была похожая проблема с Docker и Windows. Пробовал следующие варианты:

  1. Проверьте, не слишком ли медленный DNS. Я заменил несколько записей сервера имен в /etc/resolve.conf на 8.8.8.8 и сделал принудительную перезагрузку. Это помогло сократить время загрузки.

  2. Проверьте, подключается ли docker к dockerd через IPv6; который в моем случае не был слушателем. Отключение IPv6 на сетевых интерфейсах и перезагрузка компьютера помогли сократить время загрузки.

Ответ 2

Процесс сборки Docker займет немного больше времени, чем запуск контейнера. Это также зависит от кеширования докера.

Поэтому обычно при первой сборке контейнера, когда кеша нет, он занимает больше всего времени, а затем при последующих сборках докера Docker Engine использует свой кеш, если он доступен. Когда вы запускаете контейнер, он быстрее создается.

При сборке, особенно в первый раз, Docker извлекает microsoft/dotnet-framework: 4.7 из публичного реестра, если только копия не извлечена и не доступна локально в образах докера. Если это Docker Engine будет использовать его, если нет, он поместит его из удаленного хранилища. Если у вас есть локальная копия, это быстрее. Вы можете вытащить его перед сборкой, если хотите, или поместить его, возможно, в локальный частный реестр и изменить свой тег на URL вашего реестра.

Какой именно шаг медленный? Самый последний, где он получает этот nuget.exe? Если так, то первое, что приходит на ум, может быть, это разрешение имен, DNS, брандмауэры или сетевые тайм-ауты, выходящие в Интернет.

Попробуйте запустить этот контейнер, чтобы проверить разрешение имен и посмотреть, сможет ли он быстро получить этот файл.

FROM centos

ПОДДЕРЖКА Блейк Руссо

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