【问题标题】:how to return "localhost" from InetAddress.getLocalHost().getHostName() in docker container如何从 docker 容器中的 InetAddress.getLocalHost().getHostName() 返回“localhost”
【发布时间】:2018-09-14 22:22:34
【问题描述】:

在我的 docker 容器(Java 应用程序)中,对 InetAddress.getLocalHost().getHostName() 的调用返回我们在 docker run --name 'myserver' 中提供的相同名称。

有没有办法让InetAddress.getLocalHost().getHostName() 在 docker 容器内的 Java 代码中返回“localhost”?

我在 docker 容器中的 /etc/hosts 如下所示: 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback <snip> 172.17.0.5 myserver

【问题讨论】:

  • 如果你坚持它必须是本地主机,为什么不直接硬编码呢?

标签: java docker dns localhost containers


【解决方案1】:

让我们使用此示例代码来验证相同...

import java.net.InetAddress;
import java.net.UnknownHostException;
public class Util {
public static String getHostName() {
    String hostName = "";
    try {
        InetAddress inetAddress = InetAddress.getLocalHost();
        hostName = inetAddress.getHostName();
    } catch (UnknownHostException e) {

    }
    return hostName;
}

public static void main(String[] args) {
    System.out.println(getHostName());
}

}

假设您在 Box 名称 BOX1 中运行 docker 容器

和 docker containerId = 164f1347533a...

这将打印164f1347533a 作为主机名。

要获取BOX1,您必须在启动命令中传递--hostname=BOX1。

【讨论】:

  • 我正在寻找的是相反的。我的代码已经返回了 docker 容器名称(id 或给定名称),但我想返回“localhost”或它的 IP(127.0.0.1)。事实证明这实际上是依赖于实现的,例如在 MacOS 和 Linux 上的行为不同。唯一可以确定的方法似乎是调用NetworkInterface.getNetworkInterfaces 并通过接口循环使用环回(localhost)或真实的ipv4地址及其名称。
  • 如果是这样,那为什么不按照@shoan 的建议对其进行硬编码呢?
  • 我们实际上有“localhost”和传出主机地址的情况。我们最终重构了代码并处理了两者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2016-07-07
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 2022-01-09
相关资源
最近更新 更多