Files
DockMV/internal/dkr/client.go
T
2026-08-11 09:00:01 +02:00

56 lines
1.7 KiB
Go

// Package dkr wraps the Docker Engine API with the operations the migration
// tool needs: reading a full container inventory, streaming data out of a
// container's mounts, and streaming image layers.
package dkr
import (
"context"
"fmt"
"github.com/docker/docker/api/types/system"
"github.com/docker/docker/client"
)
// Client is a connection to one Docker daemon.
type Client struct {
api *client.Client
// Endpoint is the daemon address, shown in the UI.
Endpoint string
}
// New connects to the daemon described by the standard DOCKER_* environment
// variables, or to host when it is non-empty (e.g. unix:///var/run/docker.sock
// or tcp://10.0.0.5:2375).
func New(host string) (*Client, error) {
opts := []client.Opt{client.FromEnv, client.WithAPIVersionNegotiation()}
if host != "" {
opts = append(opts, client.WithHost(host))
}
api, err := client.NewClientWithOpts(opts...)
if err != nil {
return nil, fmt.Errorf("create docker client: %w", err)
}
return &Client{api: api, Endpoint: api.DaemonHost()}, nil
}
// API exposes the underlying SDK client for callers that need an operation
// this package does not wrap.
func (c *Client) API() *client.Client { return c.api }
// Close releases the daemon connection.
func (c *Client) Close() error { return c.api.Close() }
// Info returns daemon information, and doubles as a connectivity check.
func (c *Client) Info(ctx context.Context) (system.Info, error) {
return c.api.Info(ctx)
}
// Ping verifies the daemon is reachable and returns its version string.
func (c *Client) Ping(ctx context.Context) (string, error) {
v, err := c.api.ServerVersion(ctx)
if err != nil {
return "", err
}
return v.Version, nil
}