mirror of
https://github.com/crazy-max/diun.git
synced 2025-01-12 11:38:11 +00:00
0438ca485f
Co-authored-by: CrazyMax <crazy-max@users.noreply.github.com>
78 lines
1.8 KiB
Go
78 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()
|
|
}
|
|
}
|