嗨,我在解析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