Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 45 additions & 2 deletions internal/core/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@ func (d *DockerManager) run(ctx context.Context) error {
if _, ok := services[id]; !ok && srv.Provider == DockerProvider {
err := d.list.RemoveService(id)
if err != nil {
// The service id(in this case, container id) may not register
// during 'AddService' stage because it's ignored by label/env setting.
if err == servers.ErrSvrsNotExist {
continue
}
return fmt.Errorf("error removing service: %w", err)
}
}
Expand Down Expand Up @@ -172,6 +177,11 @@ func (d *DockerManager) stopHandler(m events.Message) error {
if !d.config.All {
err := d.list.RemoveService(m.ID)
if err != nil {
// The service id(in this case, container id) may not register
// during 'AddService' stage because it's ignored by label/env setting.
if err == servers.ErrSvrsNotExist {
return nil
}
return fmt.Errorf("error removing service: %w", err)
}
} else {
Expand All @@ -184,6 +194,11 @@ func (d *DockerManager) renameHandler(m events.Message) error {
logger.Debugf("Renamed container '%s'", m.ID)
err := d.list.RemoveService(m.ID)
if err != nil {
// The service id(in this case, container id) may not register
// during 'AddService' stage because it's ignored by label/env setting.
if err == servers.ErrSvrsNotExist {
return nil
}
return fmt.Errorf("error removing service: %w", err)
}
service, err := d.getService(m.ID)
Expand All @@ -202,6 +217,11 @@ func (d *DockerManager) destroyHandler(m events.Message) error {
if d.config.All {
err := d.list.RemoveService(m.ID)
if err != nil {
// The service id(in this case, container id) may not register
// during 'AddService' stage because it's ignored by label/env setting.
if err == servers.ErrSvrsNotExist {
return nil
}
return fmt.Errorf("error removing service: %w", err)
}
}
Expand All @@ -213,6 +233,23 @@ func (d *DockerManager) Stop() {
d.cancel()
}

func (d *DockerManager) getContainerIPbyId(id string) (res []net.IP, err error) {
desc, e := d.client.ContainerInspect(context.Background(), id)
if e != nil {
err = e
return

}

for _, val := range desc.NetworkSettings.Networks {
if ip := net.ParseIP(val.IPAddress); ip != nil {
res = append(res, ip)
}
}

return
}

func (d *DockerManager) getService(id string) (*servers.Service, error) {
desc, err := d.client.ContainerInspect(context.Background(), id)
if err != nil {
Expand All @@ -232,6 +269,12 @@ func (d *DockerManager) getService(id string) (*servers.Service, error) {
switch len(desc.NetworkSettings.Networks) {
case 0:
logger.Warningf("Warning, no IP address found for container '%s' ", desc.Name)
if networkmode := desc.HostConfig.NetworkMode; networkmode.IsContainer() {
logger.Debugf("%s is linked to container %s", desc.Name, networkmode.ConnectedContainer())
ips, _ := d.getContainerIPbyId(networkmode.ConnectedContainer())
service.IPs = append(service.IPs, ips...)
}

default:
for _, value := range desc.NetworkSettings.Networks {
ip := net.ParseIP(value.IPAddress)
Expand Down Expand Up @@ -297,7 +340,7 @@ func overrideFromLabels(in *servers.Service, labels map[string]string) (out *ser
var region string
for k, v := range labels {
if k == "com.dnsdock.ignore" {
return nil
in.IgnoredByUser = true
}

if k == "com.dnsdock.alias" {
Expand Down Expand Up @@ -363,7 +406,7 @@ func overrideFromEnv(in *servers.Service, env map[string]string) (out *servers.S
var region string
for k, v := range env {
if k == "DNSDOCK_IGNORE" || k == "SERVICE_IGNORE" {
return nil
in.IgnoredByUser = true
}

if k == "DNSDOCK_ALIAS" {
Expand Down
4 changes: 2 additions & 2 deletions internal/core/docker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,13 @@ func TestOverrideFromEnv(t *testing.T) {

s := getService()
s = overrideFromEnv(s, map[string]string{"SERVICE_IGNORE": "1"})
if s != nil {
if s != nil && !s.IgnoredByUser {
t.Error("Skipping failed")
}

s = getService()
s = overrideFromEnv(s, map[string]string{"DNSDOCK_IGNORE": "1"})
if s != nil {
if s != nil && !s.IgnoredByUser {
t.Error("Skipping failed(2)")
}

Expand Down
19 changes: 13 additions & 6 deletions internal/servers/dnsserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,16 @@ import (
"github.com/miekg/dns"
)

var ErrSvrsNotExist = errors.New("no such service")

// Service represents a container and an attached DNS record
type Service struct {
Name string
Image string
IPs []net.IP
TTL int
Aliases []string
Name string
Image string
IPs []net.IP
TTL int
Aliases []string
IgnoredByUser bool `json:"-"`

// Provider tracks the creator of a service
Provider string `json:"-"`
Expand Down Expand Up @@ -96,6 +99,10 @@ func (s *DNSServer) Stop() error {

// AddService adds a new container and thus new DNS records
func (s *DNSServer) AddService(id string, service Service) (err error) {
if service.IgnoredByUser {
return nil
}

if len(service.IPs) > 0 {
defer s.lock.Unlock()
s.lock.Lock()
Expand Down Expand Up @@ -131,7 +138,7 @@ func (s *DNSServer) RemoveService(id string) (err error) {
return err
}
if _, ok := s.services[id]; !ok {
return errors.New("No such service: " + id)
return ErrSvrsNotExist
}

for _, alias := range s.services[id].Aliases {
Expand Down