簡體   English   中英

Java無法解析主機名

[英]Java unable to resolve hostname

我試圖在AWS ECS容器內部引入Java應用程序,Java無法查找主機名。

ECS設置主機名並正確設置/ etc / hosts和/etc/resolv.conf。 如果我做nslookup `hostname`我的解決方案就好了。 我也可以針對/etc/resolv.conf中設置的名稱服務器解決這個問題

但是,如果我啟動嘗試解析主機名的java應用程序,我會收到一個異常,表明主機名無法解析。

java -version輸出:

bash# java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

所以我寫了一個小測試程序:

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.io.PrintWriter;
import java.io.StringWriter;

public class DomainResolutionTest {

    public static void main(String[] args) {

        try {
            InetAddress ip = InetAddress.getLocalHost();
            System.out.println(ip.toString());
        }catch (UnknownHostException uhx) {
            System.out.println("ERROR: " + uhx.getMessage() + "\n" + getStackTrace(uhx));
            Throwable cause = uhx.getCause();
            if (cause != null) System.out.println("CAUSE: " + cause.getMessage());
        }

    }

    public static String getStackTrace(Throwable t)
    {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw, true);
        t.printStackTrace(pw);
        pw.flush();
        sw.flush();
        return sw.toString();
    }

}

當主機名為'f17a0bdca449'時,會引發以下錯誤:

ERROR: f17a0bdca449: f17a0bdca449: unknown error
java.net.UnknownHostException: f17a0bdca449: f17a0bdca449: unknown error
    at java.net.InetAddress.getLocalHost(InetAddress.java:1484)
    at DomainResolutionTest.main(DomainResolutionTest.java:11)
Caused by: java.net.UnknownHostException: f17a0bdca449: unknown error
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:907)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1479)
    ... 1 more

CAUSE: f17a0bdca449: unknown error

如果我使用-Djava.net.preferIPv4Stack=true切換java以使用ipv4堆棧,我得到:

$> java -Djava.net.preferIPv4Stack=true DomainResolutionTest
ERROR: f17a0bdca449: f17a0bdca449: unknown error
java.net.UnknownHostException: f17a0bdca449: f17a0bdca449: unknown error
    at java.net.InetAddress.getLocalHost(InetAddress.java:1484)
    at DomainResolutionTest.main(DomainResolutionTest.java:11)
Caused by: java.net.UnknownHostException: f17a0bdca449: unknown error
    at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:907)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1479)
    ... 1 more

CAUSE: f17a0bdca449: unknown error

如果我強制它使用sun實現並指定NAMESERVER和SEARCH_DOMAIN我仍然得到同樣的東西:

$> export NAMESERVER=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
$> export SEARCH_DOMAIN=$(cat /etc/resolv.conf | grep search | awk '{print $2}')
$> java -Dsun.net.spi.nameservice.provider.1=dns,sun -Dsun.net.spi.nameservice.nameservers=${NAMESERVER} -Dsun.net.spi.nameservice.domain=${SEARCH_DOMAIN} -Djava.net.preferIPv4Stack=true DomainResolutionTest
ERROR: f17a0bdca449: DNS name not found [response code 3]
java.net.UnknownHostException: f17a0bdca449: DNS name not found [response code 3]
    at java.net.InetAddress.getLocalHost(InetAddress.java:1484)
    at DomainResolutionTest.main(DomainResolutionTest.java:11)
Caused by: java.net.UnknownHostException: DNS name not found [response code 3]
    at sun.net.spi.nameservice.dns.DNSNameService.resolve(DNSNameService.java:180)
    at sun.net.spi.nameservice.dns.DNSNameService.lookupAllHostAddr(DNSNameService.java:351)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1479)
    ... 1 more

CAUSE: DNS name not found [response code 3]

我沒辦法。 有什么建議么?

您獲取的主機信息是docker容器的主機名。 這個問題並不是ecs獨有的,對於在docker容器中運行的任何java應用程序都是如此。

使用ECS,您無法將主機名注入運行時配置。

在AWS環境中運行時,更好的解決方案是使用AWS元數據服務獲取主機名。

對AWS元數據服務的http GET請求應該為您提供主機的詳細信息。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

如果您的應用程序中包含java aws sdk,則可以使用以下類http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/util/EC2MetadataUtils.InstanceInfo.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM