Files
uncloud/internal/machine/docker/manager.go
T

56 lines
1.0 KiB
Go

package docker
import (
"context"
"fmt"
"github.com/docker/docker/client"
"log/slog"
"time"
"uncloud/internal/machine/store"
)
const (
NetworkName = "uncloud"
UserChain = "DOCKER-USER"
)
type Manager struct {
client *client.Client
store *store.Store
}
func NewManager(client *client.Client, store *store.Store) *Manager {
return &Manager{
client: client,
store: store,
}
}
// WaitDaemonReady waits for the Docker daemon to start and be ready to serve requests.
func (d *Manager) WaitDaemonReady(ctx context.Context) error {
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
ready, waitingLogged := false, false
for !ready {
select {
case <-ctx.Done():
return ctx.Err()
case <-ticker.C:
_, err := d.client.Ping(ctx)
if err == nil {
ready = true
break
}
if !client.IsErrConnectionFailed(err) {
return fmt.Errorf("connect to Docker daemon: %w", err)
}
if !waitingLogged {
slog.Info("Waiting for Docker daemon to start and be ready.")
waitingLogged = true
}
}
}
return nil
}