mirror of https://github.com/docker/cli.git
Bump moby to 0ede01237c9ab871f1b8db0364427407f3e46541
Includes: - [client] Remove duplicate NewClient functions - Add API support for templated secrets and configs - Adjust minimum API version for templated configs/secrets Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
939938b976
commit
60930d309c
|
@ -300,12 +300,12 @@ func newHTTPClient(host string, tlsOptions *tlsconfig.Options) (*http.Client, er
|
||||||
Timeout: 30 * time.Second,
|
Timeout: 30 * time.Second,
|
||||||
}).DialContext,
|
}).DialContext,
|
||||||
}
|
}
|
||||||
proto, addr, _, err := client.ParseHost(host)
|
hostURL, err := client.ParseHostURL(host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
sockets.ConfigureTransport(tr, proto, addr)
|
sockets.ConfigureTransport(tr, hostURL.Scheme, hostURL.Host)
|
||||||
|
|
||||||
return &http.Client{
|
return &http.Client{
|
||||||
Transport: tr,
|
Transport: tr,
|
||||||
|
|
|
@ -5,7 +5,7 @@ github.com/coreos/etcd v3.2.1
|
||||||
github.com/cpuguy83/go-md2man v1.0.8
|
github.com/cpuguy83/go-md2man v1.0.8
|
||||||
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76
|
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76
|
||||||
github.com/docker/distribution edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c
|
github.com/docker/distribution edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c
|
||||||
github.com/docker/docker 079ed017b61eb819b8184b90013ce89465d3aaba
|
github.com/docker/docker 0ede01237c9ab871f1b8db0364427407f3e46541
|
||||||
github.com/docker/docker-credential-helpers 3c90bd29a46b943b2a9842987b58fb91a7c1819b
|
github.com/docker/docker-credential-helpers 3c90bd29a46b943b2a9842987b58fb91a7c1819b
|
||||||
# the docker/go package contains a customized version of canonical/json
|
# the docker/go package contains a customized version of canonical/json
|
||||||
# and is used by Notary. The package is periodically rebased on current Go versions.
|
# and is used by Notary. The package is periodically rebased on current Go versions.
|
||||||
|
|
|
@ -3,7 +3,7 @@ package api // import "github.com/docker/docker/api"
|
||||||
// Common constants for daemon and client.
|
// Common constants for daemon and client.
|
||||||
const (
|
const (
|
||||||
// DefaultVersion of Current REST API
|
// DefaultVersion of Current REST API
|
||||||
DefaultVersion string = "1.36"
|
DefaultVersion string = "1.37"
|
||||||
|
|
||||||
// NoBaseImageSpecifier is the symbol used by the FROM
|
// NoBaseImageSpecifier is the symbol used by the FROM
|
||||||
// command to specify that no base image is to be used.
|
// command to specify that no base image is to be used.
|
||||||
|
|
|
@ -13,6 +13,10 @@ type Config struct {
|
||||||
type ConfigSpec struct {
|
type ConfigSpec struct {
|
||||||
Annotations
|
Annotations
|
||||||
Data []byte `json:",omitempty"`
|
Data []byte `json:",omitempty"`
|
||||||
|
|
||||||
|
// Templating controls whether and how to evaluate the config payload as
|
||||||
|
// a template. If it is not set, no templating is used.
|
||||||
|
Templating *Driver `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConfigReferenceFileTarget is a file target in a config reference
|
// ConfigReferenceFileTarget is a file target in a config reference
|
||||||
|
|
|
@ -14,6 +14,10 @@ type SecretSpec struct {
|
||||||
Annotations
|
Annotations
|
||||||
Data []byte `json:",omitempty"`
|
Data []byte `json:",omitempty"`
|
||||||
Driver *Driver `json:",omitempty"` // name of the secrets driver used to fetch the secret's value from an external secret store
|
Driver *Driver `json:",omitempty"` // name of the secrets driver used to fetch the secret's value from an external secret store
|
||||||
|
|
||||||
|
// Templating controls whether and how to evaluate the secret payload as
|
||||||
|
// a template. If it is not set, no templating is used.
|
||||||
|
Templating *Driver `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// SecretReferenceFileTarget is a file target in a secret reference
|
// SecretReferenceFileTarget is a file target in a secret reference
|
||||||
|
|
|
@ -42,8 +42,8 @@ For example, to list running containers (the equivalent of "docker ps"):
|
||||||
package client // import "github.com/docker/docker/client"
|
package client // import "github.com/docker/docker/client"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
@ -56,6 +56,7 @@ import (
|
||||||
"github.com/docker/docker/api/types/versions"
|
"github.com/docker/docker/api/types/versions"
|
||||||
"github.com/docker/go-connections/sockets"
|
"github.com/docker/go-connections/sockets"
|
||||||
"github.com/docker/go-connections/tlsconfig"
|
"github.com/docker/go-connections/tlsconfig"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -103,18 +104,21 @@ func CheckRedirect(req *http.Request, via []*http.Request) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEnvClient initializes a new API client based on environment variables.
|
// NewEnvClient initializes a new API client based on environment variables.
|
||||||
// Use DOCKER_HOST to set the url to the docker server.
|
// See FromEnv for a list of support environment variables.
|
||||||
// Use DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest.
|
//
|
||||||
// Use DOCKER_CERT_PATH to load the TLS certificates from.
|
// Deprecated: use NewClientWithOpts(FromEnv)
|
||||||
// Use DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default.
|
|
||||||
// deprecated: use NewClientWithOpts(FromEnv)
|
|
||||||
func NewEnvClient() (*Client, error) {
|
func NewEnvClient() (*Client, error) {
|
||||||
return NewClientWithOpts(FromEnv)
|
return NewClientWithOpts(FromEnv)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromEnv enhance the default client with values from environment variables
|
// FromEnv configures the client with values from environment variables.
|
||||||
|
//
|
||||||
|
// Supported environment variables:
|
||||||
|
// DOCKER_HOST to set the url to the docker server.
|
||||||
|
// DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest.
|
||||||
|
// DOCKER_CERT_PATH to load the TLS certificates from.
|
||||||
|
// DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default.
|
||||||
func FromEnv(c *Client) error {
|
func FromEnv(c *Client) error {
|
||||||
var httpClient *http.Client
|
|
||||||
if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" {
|
if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" {
|
||||||
options := tlsconfig.Options{
|
options := tlsconfig.Options{
|
||||||
CAFile: filepath.Join(dockerCertPath, "ca.pem"),
|
CAFile: filepath.Join(dockerCertPath, "ca.pem"),
|
||||||
|
@ -127,30 +131,58 @@ func FromEnv(c *Client) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
httpClient = &http.Client{
|
c.client = &http.Client{
|
||||||
Transport: &http.Transport{
|
Transport: &http.Transport{TLSClientConfig: tlsc},
|
||||||
TLSClientConfig: tlsc,
|
|
||||||
},
|
|
||||||
CheckRedirect: CheckRedirect,
|
CheckRedirect: CheckRedirect,
|
||||||
}
|
}
|
||||||
WithHTTPClient(httpClient)(c)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
host := os.Getenv("DOCKER_HOST")
|
if host := os.Getenv("DOCKER_HOST"); host != "" {
|
||||||
if host != "" {
|
|
||||||
// WithHost will create an API client if it doesn't exist
|
|
||||||
if err := WithHost(host)(c); err != nil {
|
if err := WithHost(host)(c); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
version := os.Getenv("DOCKER_API_VERSION")
|
|
||||||
if version != "" {
|
if version := os.Getenv("DOCKER_API_VERSION"); version != "" {
|
||||||
c.version = version
|
c.version = version
|
||||||
c.manualOverride = true
|
c.manualOverride = true
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithTLSClientConfig applies a tls config to the client transport.
|
||||||
|
func WithTLSClientConfig(cacertPath, certPath, keyPath string) func(*Client) error {
|
||||||
|
return func(c *Client) error {
|
||||||
|
opts := tlsconfig.Options{
|
||||||
|
CAFile: cacertPath,
|
||||||
|
CertFile: certPath,
|
||||||
|
KeyFile: keyPath,
|
||||||
|
ExclusiveRootPools: true,
|
||||||
|
}
|
||||||
|
config, err := tlsconfig.Client(opts)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "failed to create tls config")
|
||||||
|
}
|
||||||
|
if transport, ok := c.client.Transport.(*http.Transport); ok {
|
||||||
|
transport.TLSClientConfig = config
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.Errorf("cannot apply tls config to transport: %T", c.client.Transport)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDialer applies the dialer.DialContext to the client transport. This can be
|
||||||
|
// used to set the Timeout and KeepAlive settings of the client.
|
||||||
|
func WithDialer(dialer *net.Dialer) func(*Client) error {
|
||||||
|
return func(c *Client) error {
|
||||||
|
if transport, ok := c.client.Transport.(*http.Transport); ok {
|
||||||
|
transport.DialContext = dialer.DialContext
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.Errorf("cannot apply dialer to transport: %T", c.client.Transport)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// WithVersion overrides the client version with the specified one
|
// WithVersion overrides the client version with the specified one
|
||||||
func WithVersion(version string) func(*Client) error {
|
func WithVersion(version string) func(*Client) error {
|
||||||
return func(c *Client) error {
|
return func(c *Client) error {
|
||||||
|
@ -159,8 +191,7 @@ func WithVersion(version string) func(*Client) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithHost overrides the client host with the specified one, creating a new
|
// WithHost overrides the client host with the specified one.
|
||||||
// http client if one doesn't exist
|
|
||||||
func WithHost(host string) func(*Client) error {
|
func WithHost(host string) func(*Client) error {
|
||||||
return func(c *Client) error {
|
return func(c *Client) error {
|
||||||
hostURL, err := ParseHostURL(host)
|
hostURL, err := ParseHostURL(host)
|
||||||
|
@ -171,17 +202,10 @@ func WithHost(host string) func(*Client) error {
|
||||||
c.proto = hostURL.Scheme
|
c.proto = hostURL.Scheme
|
||||||
c.addr = hostURL.Host
|
c.addr = hostURL.Host
|
||||||
c.basePath = hostURL.Path
|
c.basePath = hostURL.Path
|
||||||
if c.client == nil {
|
|
||||||
client, err := defaultHTTPClient(host)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return WithHTTPClient(client)(c)
|
|
||||||
}
|
|
||||||
if transport, ok := c.client.Transport.(*http.Transport); ok {
|
if transport, ok := c.client.Transport.(*http.Transport); ok {
|
||||||
return sockets.ConfigureTransport(transport, c.proto, c.addr)
|
return sockets.ConfigureTransport(transport, c.proto, c.addr)
|
||||||
}
|
}
|
||||||
return fmt.Errorf("cannot apply host to http transport")
|
return errors.Errorf("cannot apply host to transport: %T", c.client.Transport)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,7 +290,7 @@ func defaultHTTPClient(host string) (*http.Client, error) {
|
||||||
// It won't send any version information if the version number is empty. It is
|
// It won't send any version information if the version number is empty. It is
|
||||||
// highly recommended that you set a version or your client may break if the
|
// highly recommended that you set a version or your client may break if the
|
||||||
// server is upgraded.
|
// server is upgraded.
|
||||||
// deprecated: use NewClientWithOpts
|
// Deprecated: use NewClientWithOpts
|
||||||
func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) {
|
func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) {
|
||||||
return NewClientWithOpts(WithHost(host), WithVersion(version), WithHTTPClient(client), WithHTTPHeaders(httpHeaders))
|
return NewClientWithOpts(WithHost(host), WithVersion(version), WithHTTPClient(client), WithHTTPHeaders(httpHeaders))
|
||||||
}
|
}
|
||||||
|
@ -332,17 +356,6 @@ func (cli *Client) DaemonHost() string {
|
||||||
return cli.host
|
return cli.host
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseHost parses a url string, validates the strings is a host url, and returns
|
|
||||||
// the parsed host as: protocol, address, and base path
|
|
||||||
// Deprecated: use ParseHostURL
|
|
||||||
func ParseHost(host string) (string, string, string, error) {
|
|
||||||
hostURL, err := ParseHostURL(host)
|
|
||||||
if err != nil {
|
|
||||||
return "", "", "", err
|
|
||||||
}
|
|
||||||
return hostURL.Scheme, hostURL.Host, hostURL.Path, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseHostURL parses a url string, validates the string is a host url, and
|
// ParseHostURL parses a url string, validates the string is a host url, and
|
||||||
// returns the parsed URL
|
// returns the parsed URL
|
||||||
func ParseHostURL(host string) (*url.URL, error) {
|
func ParseHostURL(host string) (*url.URL, error) {
|
||||||
|
@ -378,6 +391,7 @@ func (cli *Client) CustomHTTPHeaders() map[string]string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetCustomHTTPHeaders that will be set on every HTTP request made by the client.
|
// SetCustomHTTPHeaders that will be set on every HTTP request made by the client.
|
||||||
|
// Deprecated: use WithHTTPHeaders when creating the client.
|
||||||
func (cli *Client) SetCustomHTTPHeaders(headers map[string]string) {
|
func (cli *Client) SetCustomHTTPHeaders(headers map[string]string) {
|
||||||
cli.customHTTPHeaders = headers
|
cli.customHTTPHeaders = headers
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@ type CommonAPIClient interface {
|
||||||
NegotiateAPIVersion(ctx context.Context)
|
NegotiateAPIVersion(ctx context.Context)
|
||||||
NegotiateAPIVersionPing(types.Ping)
|
NegotiateAPIVersionPing(types.Ping)
|
||||||
DialSession(ctx context.Context, proto string, meta map[string][]string) (net.Conn, error)
|
DialSession(ctx context.Context, proto string, meta map[string][]string) (net.Conn, error)
|
||||||
|
Close() error
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerAPIClient defines API client methods for the containers
|
// ContainerAPIClient defines API client methods for the containers
|
||||||
|
|
|
@ -123,10 +123,7 @@ func (cli *Client) sendRequest(ctx context.Context, method, path string, query u
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
if err := cli.checkResponseErr(resp); err != nil {
|
return resp, cli.checkResponseErr(resp)
|
||||||
return resp, err
|
|
||||||
}
|
|
||||||
return resp, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResponse, error) {
|
func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResponse, error) {
|
||||||
|
|
Loading…
Reference in New Issue