Docker构建无法在Windows Server 2019上解析DNS

时间:2019-11-12 23:11:30

标签: azure docker dns window-server docker-ee

问题

运行以下命令:

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 VM(标准D2s v3 [2 vcpus,8 GiB内存])
  • VM操作系统是Windows Server 2019 Datacenter v1809
  • Docker EE(服务器引擎和客户端引擎均为v19.03.04)
  • WSL通过this guide安装和测试。
  • 通过this guide
  • 启用,测试了LCOW并将其设置为默认值
  • 使用DNS服务器配置的daemon.json文件
  • 主机已连接到互联网

背景

我正在尝试调试容器在生产环境中遇到的问题,因此我想在生产计算机上运行它。

Docker配置

daemon.json文件的内容:

{
    "experimental": true,
    "dns": ["208.67.222.222", "208.67.220.220"],
    "bridge": "none"
}

根据this documentation,此文件位于“ 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文件与this example的结构相同。

尝试的解决方案

我已尝试以下方法来纠正此问题:

  • 确认主机可以ping google.com,deb.debian.org和security.debian.org。
  • 确认主机已成功返回google.com,deb.debian.org和security.debian.org的nslookup个结果。
  • 使用用于Google DNS,OpenDNS和主机适配器DNS的DNS条目更新daemon.json文件,然后重新启动docker服务以测试连接性。
  • 指定带有docker build标志的--network命令中使用的适配器,我已经尝试了nat和none网络。
  • 在主机上的vEthernet(nat)适配器上将DNS使用设置为Google DNS和OpenDNS服务器。
  • 使用--dns标志指定要使用的DNS服务器(似乎仅可用于dockerd而非docker。
  • 按照this comment,将主机用于连接到互联网的适配器的InterfaceMetric设置为低于其他适配器的适配器。
  • 根据the documentation,确认主机网络不适用于Windows Server上的Docker EE。
  • 尝试使用docker network create -d bridge mynetwork创建桥接网络,但遇到:“来自守护程序的错误响应:在v1插件注册表中找不到插件桥:找不到插件”。
  • 使用docker network create -d transparent MyNetwork创建了一个透明的网络适配器,但是由于docker build尚未完成,因此我无法将其附加到容器上。

任何建议或帮助,将不胜感激。

1 个答案:

答案 0 :(得分:1)

打开守护程序配置,并以json格式添加DNS 8.8.8.8。然后重新启动Docker守护程序。 APT get将起作用。条目是

{
    "dns": ["8.8.8.8"]
}