mirror of
https://github.com/costela/docker-etchosts.git
synced 2025-05-11 18:05:42 +02:00
refactor connection establishment
This commit is contained in:
parent
a7f3eb52f6
commit
7bf4e645ec
2 changed files with 67 additions and 66 deletions
63
docker.go
63
docker.go
|
@ -6,6 +6,10 @@ import (
|
|||
"strings"
|
||||
|
||||
"docker.io/go-docker/api/types"
|
||||
"docker.io/go-docker/api/types/events"
|
||||
"docker.io/go-docker/api/types/filters"
|
||||
"github.com/cenkalti/backoff"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type ipsToNamesMap map[string][]string
|
||||
|
@ -13,6 +17,8 @@ type ipsToNamesMap map[string][]string
|
|||
type dockerClienter interface {
|
||||
ContainerList(context.Context, types.ContainerListOptions) ([]types.Container, error)
|
||||
ContainerInspect(context.Context, string) (types.ContainerJSON, error)
|
||||
Events(context.Context, types.EventsOptions) (<-chan events.Message, <-chan error)
|
||||
Ping(context.Context) (types.Ping, error)
|
||||
}
|
||||
|
||||
func getAllIPsToNames(client dockerClienter) (ipsToNamesMap, error) {
|
||||
|
@ -73,3 +79,60 @@ func getIPsToNames(client dockerClienter, id string) (ipsToNamesMap, error) {
|
|||
|
||||
return ipsToNames, nil
|
||||
}
|
||||
|
||||
func listenForEvents(client dockerClienter) {
|
||||
eventOpts := types.EventsOptions{
|
||||
Filters: filters.NewArgs(
|
||||
filters.Arg("type", "container"),
|
||||
filters.Arg("event", "start"),
|
||||
filters.Arg("event", "die"),
|
||||
),
|
||||
}
|
||||
|
||||
events, errors := client.Events(context.Background(), eventOpts)
|
||||
loop:
|
||||
for {
|
||||
select {
|
||||
case event := <-events:
|
||||
switch event.Action {
|
||||
case "start":
|
||||
ipsToNames, err := getIPsToNames(client, event.Actor.Attributes["name"])
|
||||
if err != nil {
|
||||
log.WithFields(
|
||||
log.Fields{"container": event.Actor.ID},
|
||||
).Errorf("could not get info for container: %s", err)
|
||||
continue
|
||||
}
|
||||
err = addToEtcHosts(ipsToNames)
|
||||
if err != nil {
|
||||
log.WithFields(
|
||||
log.Fields{"container": event.Actor.ID},
|
||||
).Errorf("could not add container to hosts file: %s", err)
|
||||
}
|
||||
case "die":
|
||||
// We remove by name because we cannot get the container's IP after it has been stopped.
|
||||
// Names are supposed to be kept unique by the docker deamon.
|
||||
removeFromEtcHosts(event.Actor.Attributes["name"])
|
||||
}
|
||||
case err := <-errors:
|
||||
log.Errorf("error fetching event: %s", err)
|
||||
break loop
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func waitForConnection(client dockerClienter) {
|
||||
err := backoff.Retry(func() error {
|
||||
log.Info("retrying connection to docker")
|
||||
_, err := client.Ping(context.Background())
|
||||
if err != nil {
|
||||
return fmt.Errorf("error pinging docker server: %s", err)
|
||||
}
|
||||
return nil
|
||||
}, backoff.NewExponentialBackOff())
|
||||
if err != nil {
|
||||
// we should not get here with infinite backoff
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Info("connected to docker daemon")
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue