curl:(6)无法解析主机:localhost

curl:(6)无法解析主机:localhost

嗨,我在解析docker容器中的localhost时遇到了问题

[devcontainer]$ cat /etc/hosts
127.0.0.1 localhost
[devcontainer]$ curl localhost
curl: (6) Could not resolve host: localhost

node 也有同样的问题

[devcontainer]$ /home/plutus/.vscode-server/bin/e713fe9b05fc24facbec8f34fb1017133858842b/node
Welcome to Node.js v14.16.0.
Type ".help" for more information.
> dns.lookup('localhost', {hints: dns.ADDRCONFIG|dns.V4MAPPED}, console.log)
GetAddrInfoReqWrap {
  callback: [Function: log],
  family: 0,
  hostname: 'localhost',
  oncomplete: [Function: onlookup]
}
> Error: getaddrinfo ENOTFOUND localhost
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26)
    at GetAddrInfoReqWrap.callbackTrampoline (internal/async_hooks.js:131:14) {
  errno: -3007,
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'localhost'
}

尽管有 /etc/hosts,您知道问题可能出在哪里吗?它肯定包含 localhost。

是的,正常主机正在运行:

[devcontainer]$ curl google.de
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">

答案1

Linux 上的标准主机名查找功能用于/etc/nsswitch.conf确定应在何处查找信息。请确保该文件存在且可供所有人读取。

nsswitch.conf 文件指定哪个模块用于每个数据库。例如,有一个标准的“files”模块,用于读取 /etc/hosts(和 /etc/passwd);有一个“dns”模块,用于进行 DNS 查询;并且可以安装 LDAP、NIS、MySQL 等模块。

确保 nsswitch.conf 包含hosts:一行,并且该行在files其中的某处提到该模块(模块从左到右处理)。

例如,通常它将被配置成如下形式(现代发行版可能包含更多模块,但这是每个人都拥有的基本最低限度):

passwd: files
hosts: files dns
...

此配置告诉“hosts”查找功能首先使用“files”模块(读取 /etc/hosts),然后如果没有成功的结果,则使用“dns”模块(根据 /etc/resolv.conf 进行 DNS 查询)。

每个模块都以库的形式存在于 /lib(或 /usr/lib)中。因此,如果您要使用该files模块,请确保您的系统确实已/lib/libnss_files.so.2安装该模块。


请注意,如果 nsswitch.conf 文件丢失或无法读取,Glibc 将使用这个硬编码的默认配置:

passwd: files
hosts: dns [!UNAVAIL=return] files
...

这意味着将首先尝试 DNS,如果它提供任何答案(即使是“未找到”),查询也会立即停止——“文件”模块(读取/etc/hosts)根本不会被调用。


您可以使用以下命令测试名称服务配置getent

  • 根据nsswitch.conf来查询:
    getent hosts localhost
    getent passwd root

  • 要查询特定模块(绕过 nsswitch.conf):
    getent -s dns hosts example.com
    getent -s files hosts localhost

相关内容