mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-26 19:13:34 +00:00
56 lines
1.0 KiB
Go
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
|
|
}
|