fix(docker): ensure connection is established with host

The `docker` and `docker_swarm` providers have been patched to ensure that the connection is properly established upon starting.

If the docker host is not available at starting time, then the application will stop. This will prevent from trying to register to the event stream on a non working client.
This commit is contained in:
Alexis Couvreur
2024-06-27 23:54:09 +00:00
parent 372fa39ef5
commit 7ddb6ae6e0
2 changed files with 39 additions and 7 deletions

View File

@@ -25,10 +25,16 @@ type DockerClassicProvider struct {
func NewDockerClassicProvider() (*DockerClassicProvider, error) {
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Fatal(fmt.Errorf("%+v", "Could not connect to docker API"))
return nil, err
return nil, fmt.Errorf("cannot create docker client: %v", err)
}
serverVersion, err := cli.ServerVersion(context.Background())
if err != nil {
return nil, fmt.Errorf("cannot connect to docker host: %v", err)
}
log.Trace(fmt.Sprintf("connection established with docker %s (API %s)", serverVersion.Version, serverVersion.APIVersion))
return &DockerClassicProvider{
Client: cli,
desiredReplicas: 1,
@@ -144,14 +150,23 @@ func (provider *DockerClassicProvider) NotifyInstanceStopped(ctx context.Context
})
for {
select {
case msg := <-msgs:
case msg, ok := <-msgs:
if !ok {
log.Error("provider event stream is closed")
return
}
// Send the container that has died to the channel
instance <- strings.TrimPrefix(msg.Actor.Attributes["name"], "/")
case err := <-errs:
case err, ok := <-errs:
if !ok {
log.Error("provider event stream is closed", err)
return
}
if errors.Is(err, io.EOF) {
log.Debug("provider event stream closed")
return
}
log.Error("provider event stream error", err)
case <-ctx.Done():
return
}

View File

@@ -23,8 +23,16 @@ type DockerSwarmProvider struct {
func NewDockerSwarmProvider() (*DockerSwarmProvider, error) {
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
return nil, err
return nil, fmt.Errorf("cannot create docker client: %v", err)
}
serverVersion, err := cli.ServerVersion(context.Background())
if err != nil {
return nil, fmt.Errorf("cannot connect to docker host: %v", err)
}
log.Trace(fmt.Sprintf("connection established with docker %s (API %s)", serverVersion.Version, serverVersion.APIVersion))
return &DockerSwarmProvider{
Client: cli,
desiredReplicas: 1,
@@ -161,17 +169,26 @@ func (provider *DockerSwarmProvider) NotifyInstanceStopped(ctx context.Context,
go func() {
for {
select {
case msg := <-msgs:
case msg, ok := <-msgs:
if !ok {
log.Error("provider event stream is closed")
return
}
if msg.Actor.Attributes["replicas.new"] == "0" {
instance <- msg.Actor.Attributes["name"]
} else if msg.Action == "remove" {
instance <- msg.Actor.Attributes["name"]
}
case err := <-errs:
case err, ok := <-errs:
if !ok {
log.Error("provider event stream is closed", err)
return
}
if errors.Is(err, io.EOF) {
log.Debug("provider event stream closed")
return
}
log.Error("provider event stream error", err)
case <-ctx.Done():
return
}