golang 컨테이너 내 DNS 분석 문제 검색
4601 단어 golang
package main
import (
"fmt"
"net"
"os"
)
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "Usage: %s hostname
", os.Args[0])
fmt.Println("Usage: ", os.Args[0], "hostname")
os.Exit(1)
}
name := os.Args[1]
addr, err := net.ResolveIPAddr("ip", name)
if err != nil {
fmt.Println("Resolution error", err.Error())
os.Exit(1) }
fmt.Println("Resolved address is ", addr.String())
os.Exit(0)
}
한 호스트에 여러 개의 네트워크 카드가 있는 경우 여러 IP 주소에 해당하거나 인터넷 고가용성 도메인 이름이 여러 IP에 해당할 수 있습니다.
addrs, err := net.LookupHost(name)
여러 호스트 주소 확인
만약 자신이/etc/hosts를 통해 주입된 도메인을 호스트 위에서 실행하면 아무런 문제가 없지만 용기에 넣고 실행하면 도메인을 해석할 수 없는 문제가 발생할 수 있습니다. Golang 1.8.3의 원본 코드를 통해 Golang이 해석한 dns의 과정인net/lookupunix.go
func (r *Resolver) lookupHost(ctx context.Context, host string) (addrs []string, err error) {
order := systemConf().hostLookupOrder(host)
if !r.PreferGo && order == hostLookupCgo {
if addrs, err, ok := cgoLookupHost(ctx, host); ok {
return addrs, err
}
// cgo not available (or netgo); fall back to Go's DNS resolver
order = hostLookupFilesDNS
}
return goLookupHostOrder(ctx, host, order)
}
hostLookupOrder를 통해 해결 순서 결정
nss := c.nss
srcs := nss.sources["hosts"]
// If /etc/nsswitch.conf doesn't exist or doesn't specify any
// sources for "hosts", assume Go's DNS will work fine.
if os.IsNotExist(nss.err) || (nss.err == nil && len(srcs) == 0) {
if c.goos == "solaris" {
// illumos defaults to "nis [NOTFOUND=return] files"
return fallbackOrder
}
if c.goos == "linux" {
// glibc says the default is "dns [!UNAVAIL=return] files"
// http://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html.
return hostLookupDNSFiles
}
return hostLookupFilesDNS
}
if nss.err != nil {
// We failed to parse or open nsswitch.conf, so
// conservatively assume we should use cgo if it's
// available.
return fallbackOrder
}
위의 nss는/etc/nsswitch입니다.conf 이 파일은 이 파일이 존재하지 않으면hostLookupDNSFiles를 통해 해석됩니다. dns의 우선순위입니다.
용기 안에서 운행하면/etc/nsswitch가 자주 없습니다.conf 이 파일의 golang 해석은 이 파일을 읽고 해석 순서를 얻어야 하기 때문에 용기에 이 파일을 만들고 추가해야 합니다
hosts: files dns
files를 먼저 읽고 dns로 해석하면 ok입니다. 물론 cgo를 설정할 수도 있고 전통적인 c라이브러리로 가도 해결할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.