Сборка Docker не может разрешить DNS на Windows Server 2019
Проблема
Выполнение следующей команды:
docker build --rm -f "c:\Users\...\iotedgeModbus\Dockerfile.amd64.debug" -t
modbus:dev-amd64.debug "c:\Users\...\iotedgeModbus" ; if ($?) { iotedgehubdev start -d "c:\Users\...\iotedgeModbus\config\deployment.debug.amd64.json" -v }
выводит ошибки, связанные с разрешением DNS-имен:
Step 2/21 : RUN apt-get update && apt-get install -y --no-install-recommends unzip procps
&& rm -rf /var/lib/apt/lists/*
---> Running in a389a7d1ff0d
Err:1 http://security.debian.org/debian-security buster/updates InRelease
Temporary failure resolving 'security.debian.org'
Err:2 http://deb.debian.org/debian buster InRelease
Temporary failure resolving 'deb.debian.org'
Err:3 http://deb.debian.org/debian buster-updates InRelease
Temporary failure resolving 'deb.debian.org'
Reading package lists...
Полная трассировка стека:
docker build --rm -f "c:\Users\...\iotedgeModbus\Dockerfile.amd64.debug" -t
modbus:dev-amd64.debug "c:\Users\...\iotedgeModbus" ; if ($?) { iotedgehubdev start -d "c:\Users\...\iotedgeModbus\config\deployment.debug.amd64.json" -v }
Sending build context to Docker daemon 699.9kB
Step 1/21 : FROM mcr.microsoft.com/dotnet/core/runtime:3.0.0-buster-slim AS base
---> b525e32f0752
Step 2/21 : RUN apt-get update && apt-get install -y --no-install-recommends unzip procps
&& rm -rf /var/lib/apt/lists/*
---> Running in a389a7d1ff0d
Err:1 http://security.debian.org/debian-security buster/updates InRelease
Temporary failure resolving 'security.debian.org'
Err:2 http://deb.debian.org/debian buster InRelease
Temporary failure resolving 'deb.debian.org'
Err:3 http://deb.debian.org/debian buster-updates InRelease
Temporary failure resolving 'deb.debian.org'
Reading package lists...
W: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease Temporary failure resolving 'deb.debian.org'
W: Failed to fetch http://security.debian.org/debian-security/dists/buster/updates/InRelease
Temporary failure resolving 'security.debian.org'
W: Failed to fetch http://deb.debian.org/debian/dists/buster-updates/InRelease Temporary failure resolving 'deb.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.
Reading package lists...
Building dependency tree...
Reading state information...
E: Unable to locate package unzip
E: Unable to locate package procps
The command '/bin/sh -c apt-get update && apt-get install -y --no-install-recommends unzip procps && rm -rf /var/lib/apt/lists/*' returned a non-zero code: 100
Настроить
У меня такая конфигурация:
- Виртуальная машина Azure (Standard D2s v3 [2 виртуальных процессора, 8 ГиБ памяти])
- ОС ВМ - Windows Server 2019 Datacenter v1809.
- Docker EE (v19.03.04 для серверных и клиентских движков)
- WSL установлен и протестирован с помощью этого руководства.
- LCOW включен, протестирован и установлен по умолчанию в этом руководстве.
- файл daemon.json, настроенный с DNS-серверами
- Хост подключен к Интернету
Задний план
Я пытаюсь отладить проблему, с которой мой контейнер сталкивается в производственной среде, поэтому я хочу запустить ее на производственной машине.
Конфигурация докера
Содержание daemon.json
файл:
{
"experimental": true,
"dns": ["208.67.222.222", "208.67.220.220"],
"bridge": "none"
}
Этот файл находится в "C:\ProgramData\Docker\config\" согласно этой документации.
Бег docker info
выходы:
Client:
Debug Mode: false
Plugins:
cluster: Manage Docker clusters (Docker Inc., v1.2.0)
Server:
Containers: 5
Running: 0
Paused: 0
Stopped: 5
Images: 3
Server Version: 19.03.4
Storage Driver: windowsfilter (windows) lcow (linux)
Windows:
LCOW:
Logging Driver: json-file
Plugins:
Volume: local
Network: ics internal l2bridge l2tunnel nat null overlay private transparent
Log: awslogs etwlogs fluentd gcplogs gelf json-file local logentries splunk syslog
Swarm: inactive
Default Isolation: process
Kernel Version: 10.0 17763 (17763.1.amd64fre.rs5_release.180914-1434)
Operating System: Windows Server 2019 Datacenter Version 1809 (OS Build 17763.864)
OSType: windows
Architecture: x86_64
CPUs: 2
Total Memory: 8GiB
Name: xxxxxxxx
ID: GMKH:37MH:LDBL:AXQA:DYNK:342Y:A2AR:OLJP:WRJM:YQV2:4XZA:XJCR
Docker Root Dir: C:\ProgramData\docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: true
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Бег docker network ls
выходы:
NETWORK ID NAME DRIVER SCOPE
3c451e980ddd nat nat local
c2d54c8da069 none null local
Бег docker network inspect nat
выходы:
[
{
"Name": "nat",
"Id": "3c451e980dddda1b46005caba457f56efb4aba610668c5d58f7c3cc839604347",
"Created": "2019-11-12T22:07:47.6443712Z",
"Scope": "local",
"Driver": "nat",
"EnableIPv6": false,
"IPAM": {
"Driver": "windows",
"Options": null,
"Config": [
{
"Subnet": "172.20.160.0/20",
"Gateway": "172.20.160.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.windowsshim.hnsid": "8991C564-50DB-4AE0-9C75-7B117787CC7E",
"com.docker.network.windowsshim.networkname": "nat"
},
"Labels": {}
}
]
Содержание Dockerfile.amd64.debug
находятся:
FROM mcr.microsoft.com/dotnet/core/runtime:3.0.0-buster-slim AS base
RUN apt-get update && \
apt-get install -y --no-install-recommends unzip procps && \
rm -rf /var/lib/apt/lists/*
RUN useradd -ms /bin/bash moduleuser
USER moduleuser
RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg
FROM mcr.microsoft.com/dotnet/core/sdk AS build-env
WORKDIR /app
COPY *.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Debug -o out
FROM gcc:7 AS build-env-2
WORKDIR /app
# copy .c and .h file
COPY *.c ./
COPY *.h ./
# build
RUN gcc -shared -o libcomWrapper.so -fPIC comWrapper.c
FROM base
WORKDIR /app
COPY --from=build-env /app/out ./
COPY --from=build-env-2 /app/libcomWrapper.so /usr/lib/
ENTRYPOINT ["dotnet", "iotedgeModbus.dll"]
Мой deployment.debug.template.json
файл имеет ту же структуру, что и в этом примере.
Попытки решения
Я пробовал следующее, чтобы исправить проблему:
- Подтверждено, что хозяин может
ping
google.com, deb.debian.org и security.debian.org. - Подтверждено, что хост-машина успешно возвращается
nslookup
результаты для google.com, deb.debian.org и security.debian.org. - Обновленный файл daemon.json с записями DNS для Google DNS, OpenDNS и DNS хост-адаптера, а затем перезапуск службы докеров для проверки возможности подключения.
- Указан адаптер для использования в
docker build
команда с--network
flag, я пробовал как сеть nat, так и сеть none. - Настройка использования DNS для серверов Google DNS и OpenDNS на адаптере vEthernet (nat) на хост-машине.
- Указание DNS-серверов для использования с
--dns
flag (кажется, доступен только для dockerd, а не для docker. - Установка
InterfaceMetric
адаптера, который хост использует для подключения к Интернету, должен быть ниже, чем у других адаптеров, согласно этому комментарию. - Подтверждено, что сеть хостов не работает для Docker EE на Windows Server согласно документации.
- Попытка создать мостовую сеть с
docker network create -d bridge mynetwork
но обнаружено: "Ответ об ошибке от демона: не удалось найти мост плагина в реестре плагинов v1: плагин не найден". - Создал прозрачный сетевой адаптер с помощью
docker network create -d transparent MyNetwork
но с тех порdocker build
не комплектуется, я не могу прикрепить его к контейнеру.
Любой совет или помощь будут оценены.
2 ответа
Откройте конфигурацию демона и добавьте DNS 8.8.8.8 в формате json. Затем перезапустите демон докера. Apt get будет работать. Запись
{
"dns": ["8.8.8.8"]
}
В моем случае ошибка, которую я получал, заключалась в отладке контейнера Windows Docker с помощью Visual Studio 2019.
Когда визуальная студия работает:
docker exec -i {container-name} "c:\Windows\System32\curl.exe" -sSL "https://aka.ms/vs/16/release/16.11/debugger/OneCore.Msvsmon.amd64.enu.zip" -w "%{content_type}" -o "c:\.vs-debugger\OneCore.Msvsmon.amd64.enu.zip"
я получал
curl: (6) Could not resolve host: aka.ms
Решение состояло в том, чтобы добавить DNS в механизм Docker следующим образом:
Docker -> Настройки -> Docker Engine (я только добавил
dns
параметр) :
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": false,
"experimental": false,
"dns": [
"8.8.8.8",
"8.8.4.4"
]
}