crazy-max_diun/pkg/docker/client.go

79 lines
1.8 KiB
Go

package docker
import (
"context"
"net/http"
"path/filepath"
"github.com/docker/docker/client"
"github.com/docker/go-connections/tlsconfig"
"github.com/pkg/errors"
)
// Client represents an active docker object
type Client struct {
ctx context.Context
API *client.Client
}
// Options holds docker client object options
type Options struct {
Endpoint string
APIVersion string
TLSCertPath string
TLSVerify bool
}
// New initializes a new Docker API client with default values
func New(opts Options) (*Client, error) {
var dockerOpts []client.Opt
if opts.Endpoint != "" {
dockerOpts = append(dockerOpts, client.WithHost(opts.Endpoint))
}
if opts.APIVersion != "" {
dockerOpts = append(dockerOpts, client.WithVersion(opts.APIVersion))
} else {
dockerOpts = append(dockerOpts, client.WithAPIVersionNegotiation())
}
if opts.TLSCertPath != "" {
options := tlsconfig.Options{
CAFile: filepath.Join(opts.TLSCertPath, "ca.pem"),
CertFile: filepath.Join(opts.TLSCertPath, "cert.pem"),
KeyFile: filepath.Join(opts.TLSCertPath, "key.pem"),
InsecureSkipVerify: !opts.TLSVerify,
}
tlsc, err := tlsconfig.Client(options)
if err != nil {
return nil, errors.Wrap(err, "failed to create TLS config")
}
httpCli := &http.Client{
Transport: &http.Transport{TLSClientConfig: tlsc},
CheckRedirect: client.CheckRedirect,
}
dockerOpts = append(dockerOpts, client.WithHTTPClient(httpCli))
}
cli, err := client.NewClientWithOpts(dockerOpts...)
if err != nil {
return nil, err
}
ctx := context.Background()
_, err = cli.ServerVersion(ctx)
if err != nil {
return nil, err
}
return &Client{
ctx: ctx,
API: cli,
}, err
}
// Close closes docker client
func (c *Client) Close() {
if c.API != nil {
_ = c.API.Close()
}
}