Files
2025-11-25 01:30:26 +03:00

126 lines
2.7 KiB
Go

package dockerdiscovery
import (
"strconv"
"github.com/coredns/coredns/core/dnsserver"
"github.com/coredns/coredns/plugin"
dockerapi "github.com/fsouza/go-dockerclient"
"github.com/coredns/caddy"
)
const defaultDockerEndpoint = "unix:///var/run/docker.sock"
const defaultDockerDomain = "docker.local"
func init() {
caddy.RegisterPlugin("docker", caddy.Plugin{
ServerType: "dns",
Action: setup,
})
}
// TODO(kevinjqiu): add docker endpoint verification
func createPlugin(c *caddy.Controller) (*DockerDiscovery, error) {
dd := NewDockerDiscovery(defaultDockerEndpoint)
labelResolver := &LabelResolver{hostLabel: "coredns.dockerdiscovery.host"}
dd.resolvers = append(dd.resolvers, labelResolver)
for c.Next() {
args := c.RemainingArgs()
if len(args) == 1 {
dd.dockerEndpoint = args[0]
}
if len(args) > 1 {
return dd, c.ArgErr()
}
for c.NextBlock() {
var value = c.Val()
switch value {
case "domain":
var resolver = &SubDomainContainerNameResolver{
domain: defaultDockerDomain,
}
dd.resolvers = append(dd.resolvers, resolver)
if !c.NextArg() {
return dd, c.ArgErr()
}
resolver.domain = c.Val()
case "hostname_domain":
var resolver = &SubDomainHostResolver{
domain: defaultDockerDomain,
}
dd.resolvers = append(dd.resolvers, resolver)
if !c.NextArg() {
return dd, c.ArgErr()
}
resolver.domain = c.Val()
case "compose_domain":
var resolver = &ComposeResolver{
domain: defaultDockerDomain,
}
dd.resolvers = append(dd.resolvers, resolver)
if !c.NextArg() {
return dd, c.ArgErr()
}
resolver.domain = c.Val()
case "network_aliases":
var resolver = &NetworkAliasesResolver{
network: "",
}
dd.resolvers = append(dd.resolvers, resolver)
if !c.NextArg() {
return dd, c.ArgErr()
}
resolver.network = c.Val()
case "filter_network":
if !c.NextArg() {
return dd, c.ArgErr()
}
dd.filterNetwork = c.Val()
case "label":
if !c.NextArg() {
return dd, c.ArgErr()
}
labelResolver.hostLabel = c.Val()
case "ttl":
if !c.NextArg() {
return dd, c.ArgErr()
}
ttl, err := strconv.ParseUint(c.Val(), 10, 32)
if err != nil {
return dd, err
}
if ttl > 0 {
dd.ttl = uint32(ttl)
}
default:
return dd, c.Errf("unknown property: '%s'", c.Val())
}
}
}
dockerClient, err := dockerapi.NewClient(dd.dockerEndpoint)
if err != nil {
return dd, err
}
dd.dockerClient = dockerClient
go dd.start()
return dd, nil
}
func setup(c *caddy.Controller) error {
dd, err := createPlugin(c)
if err != nil {
return err
}
dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler {
dd.Next = next
return dd
})
return nil
}