Docker openjdk:8 UnknownHostException

Docker openjdk:8 UnknownHostException

我有自定义 java 应用程序,它使用 org.​apache.​commons.​io.FileUtils.copyFile(File srcFile, File destFile) 从 Web 下载文件。当它直接 运行 时它工作得很好但是当我从 docker 容器中 运行 它时我得到以下异常:

Exception in thread "main" java.net.UnknownHostException: <MY HOST>
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
at sun.net.www.http.HttpClient.New(HttpClient.java:339)
at sun.net.www.http.HttpClient.New(HttpClient.java:357)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at org.apache.commons.io.FileUtils.copyURLToFile(FileUtils.java:1506)

我尝试使用 EXPOSE 8080EXPOSE 8443 和 运行 -P 选项公开容器上的 httphttps 端口。接下来是 运行 使用 --hostname=127.0.0.1 选项连接容器。然后我找到了 Dockerfile: RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf 的 hack。没有任何帮助。您对如何解决这个问题有什么建议吗?

Docker版本17.10.0-ce, build f4ffd25, Docker文件基础图像:openjdk:8

Docker 图片 /etc/hosts 包含:

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      afa4800849e0

问题出在容器内部使用的DNS服务器上。它要么与主机 DNS 不匹配,要么不包含请求的 DNS 名称。

您可以通过在容器启动期间传递一个众所周知的 DNS 服务器来解决问题。

使用

--dns=8.8.8.8

参考 Google DNS。

另请参阅 the docker documentation 了解 DNS 设置。