Skip to content

Commit

Permalink
Merge pull request #374 from hypnoce/dns
Browse files Browse the repository at this point in the history
Fixes #275 : use host dns with slirp4netns support in rootless mode
  • Loading branch information
AkihiroSuda committed Sep 21, 2021
2 parents ca81e3a + 71e3c4f commit 2895d60
Show file tree
Hide file tree
Showing 4 changed files with 681 additions and 17 deletions.
25 changes: 23 additions & 2 deletions cmd/nerdctl/run.go
Expand Up @@ -49,6 +49,7 @@ import (
"github.com/containerd/nerdctl/pkg/netutil"
"github.com/containerd/nerdctl/pkg/netutil/nettype"
"github.com/containerd/nerdctl/pkg/portutil"
"github.com/containerd/nerdctl/pkg/resolvconf"
"github.com/containerd/nerdctl/pkg/rootlessutil"
"github.com/containerd/nerdctl/pkg/strutil"
"github.com/containerd/nerdctl/pkg/taskutil"
Expand Down Expand Up @@ -111,7 +112,6 @@ var runCommand = &cli.Command{
&cli.StringSliceFlag{
Name: "dns",
Usage: "Set custom DNS servers",
Value: cli.NewStringSlice("8.8.8.8", "1.1.1.1"),
},
&cli.StringSliceFlag{
Name: "publish",
Expand Down Expand Up @@ -432,7 +432,28 @@ func runAction(clicontext *cli.Context) error {
}

resolvConfPath := filepath.Join(stateDir, "resolv.conf")
if err := dnsutil.WriteResolvConfFile(resolvConfPath, strutil.DedupeStrSlice(clicontext.StringSlice("dns"))); err != nil {
conf, err := resolvconf.Get()
if err != nil {
return err
}
slirp4Dns := []string{}
if rootlessutil.IsRootlessChild() {
slirp4Dns, err = dnsutil.GetSlirp4netnsDns()
if err != nil {
return err
}
}
conf, err = resolvconf.FilterResolvDNS(conf.Content, true)
if err != nil {
return err
}
searchDomains := resolvconf.GetSearchDomains(conf.Content)
dnsOptions := resolvconf.GetOptions(conf.Content)
nameServers := strutil.DedupeStrSlice(clicontext.StringSlice("dns"))
if len(nameServers) == 0 {
nameServers = resolvconf.GetNameservers(conf.Content, resolvconf.IPv4)
}
if _, err := resolvconf.Build(resolvConfPath, append(slirp4Dns, nameServers...), searchDomains, dnsOptions); err != nil {
return err
}
// the content of /etc/hosts is created in OCI Hook
Expand Down
30 changes: 15 additions & 15 deletions pkg/dnsutil/dnsutil.go
Expand Up @@ -17,25 +17,25 @@
package dnsutil

import (
"bytes"
"io/ioutil"
"net"
"context"

"github.com/pkg/errors"
"github.com/containerd/nerdctl/pkg/rootlessutil"
)

func WriteResolvConfFile(path string, dns []string) error {
var b bytes.Buffer
if _, err := b.Write([]byte("search localdomain\n")); err != nil {
return err
func GetSlirp4netnsDns() ([]string, error) {
var dns []string
rkClient, err := rootlessutil.NewRootlessKitClient()
if err != nil {
return dns, err
}
for _, entry := range dns {
if net.ParseIP(entry) == nil {
return errors.Errorf("invalid dns %q", entry)
}
if _, err := b.Write([]byte("nameserver " + entry + "\n")); err != nil {
return err
info, err := rkClient.Info(context.TODO())
if err != nil {
return dns, err
}
if info != nil && info.NetworkDriver != nil {
for _, dnsIp := range info.NetworkDriver.DNS {
dns = append(dns, dnsIp.String())
}
}
return ioutil.WriteFile(path, b.Bytes(), 0644)
return dns, nil
}

0 comments on commit 2895d60

Please sign in to comment.