Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java无法解析主机名_Java_Amazon Web Services - Fatal编程技术网

Java无法解析主机名

Java无法解析主机名,java,amazon-web-services,Java,Amazon Web Services,我试图在AWS ECS容器中安装Java应用程序,但Java无法查找主机名 ECS设置主机名并正确设置/etc/hosts和/etc/resolv.conf。如果我做了nslookup`hostname`我就可以得到很好的分辨率。我还可以根据/etc/resolv.conf中设置的名称服务器来解决这个问题 但是,如果启动尝试解析主机名的java应用程序,就会出现一个异常,表明无法解析主机名 java版本输出: bash# java -version java version "1.8.0_45"

我试图在AWS ECS容器中安装Java应用程序,但Java无法查找主机名

ECS设置主机名并正确设置/etc/hosts和/etc/resolv.conf。如果我做了
nslookup`hostname`
我就可以得到很好的分辨率。我还可以根据/etc/resolv.conf中设置的名称服务器来解决这个问题

但是,如果启动尝试解析主机名的java应用程序,就会出现一个异常,表明无法解析主机名

java版本输出:

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请求应该可以为您获取主机的详细信息

如果应用程序中包含java aws sdk,则可以利用以下类

getent主机f17a0bdca449
为您提供了什么?正确的地址。我认为问题实际上是我正在运行的linux版本。在不同的平台上重建。对于“使用ECS,您没有将主机名作为运行时配置注入的选项”,我认为这部分是正确的。使用ECS中的“EC2”任务类型,可以配置主机名。