mirror of https://github.com/docker/cli.git
[18.09] bump docker/engine
Bump github.com/docker/engine to include https://github.com/docker/engine/pull/188 Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
This commit is contained in:
parent
9787a2d94b
commit
7a964b3b60
|
@ -12,7 +12,7 @@ github.com/cpuguy83/go-md2man 20f5889cbdc3c73dbd2862796665
|
||||||
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76 # v1.1.0
|
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76 # v1.1.0
|
||||||
github.com/dgrijalva/jwt-go a2c85815a77d0f951e33ba4db5ae93629a1530af
|
github.com/dgrijalva/jwt-go a2c85815a77d0f951e33ba4db5ae93629a1530af
|
||||||
github.com/docker/distribution 83389a148052d74ac602f5f1d62f86ff2f3c4aa5
|
github.com/docker/distribution 83389a148052d74ac602f5f1d62f86ff2f3c4aa5
|
||||||
github.com/docker/docker 200b524eff60a9c95a22bc2518042ac2ff617d07 https://github.com/docker/engine # 18.09 branch
|
github.com/docker/docker 10ca83725886b3804b5ba53f26678877104ec96d https://github.com/docker/engine # 18.09 branch
|
||||||
github.com/docker/docker-credential-helpers 54f0238b6bf101fc3ad3b34114cb5520beb562f5 # v0.6.3
|
github.com/docker/docker-credential-helpers 54f0238b6bf101fc3ad3b34114cb5520beb562f5 # v0.6.3
|
||||||
github.com/docker/go d30aec9fd63c35133f8f79c3412ad91a3b08be06 # Contains a customized version of canonical/json and is used by Notary. The package is periodically rebased on current Go versions.
|
github.com/docker/go d30aec9fd63c35133f8f79c3412ad91a3b08be06 # Contains a customized version of canonical/json and is used by Notary. The package is periodically rebased on current Go versions.
|
||||||
github.com/docker/go-connections 7395e3f8aa162843a74ed6d48e79627d9792ac55 # v0.4.0
|
github.com/docker/go-connections 7395e3f8aa162843a74ed6d48e79627d9792ac55 # v0.4.0
|
||||||
|
|
|
@ -120,7 +120,7 @@ type NetworkStats struct {
|
||||||
RxBytes uint64 `json:"rx_bytes"`
|
RxBytes uint64 `json:"rx_bytes"`
|
||||||
// Packets received. Windows and Linux.
|
// Packets received. Windows and Linux.
|
||||||
RxPackets uint64 `json:"rx_packets"`
|
RxPackets uint64 `json:"rx_packets"`
|
||||||
// Received errors. Not used on Windows. Note that we dont `omitempty` this
|
// Received errors. Not used on Windows. Note that we don't `omitempty` this
|
||||||
// field as it is expected in the >=v1.21 API stats structure.
|
// field as it is expected in the >=v1.21 API stats structure.
|
||||||
RxErrors uint64 `json:"rx_errors"`
|
RxErrors uint64 `json:"rx_errors"`
|
||||||
// Incoming packets dropped. Windows and Linux.
|
// Incoming packets dropped. Windows and Linux.
|
||||||
|
|
|
@ -16,7 +16,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
cli, err := client.NewEnvClient()
|
cli, err := client.NewClientWithOpts(client.FromEnv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ For example, to list running containers (the equivalent of "docker ps"):
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
cli, err := client.NewEnvClient()
|
cli, err := client.NewClientWithOpts(client.FromEnv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -47,16 +47,13 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/api"
|
"github.com/docker/docker/api"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"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/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -90,7 +87,7 @@ type Client struct {
|
||||||
// If the request is non-GET return `ErrRedirect`. Otherwise use the last response.
|
// If the request is non-GET return `ErrRedirect`. Otherwise use the last response.
|
||||||
//
|
//
|
||||||
// Go 1.8 changes behavior for HTTP redirects (specifically 301, 307, and 308) in the client .
|
// Go 1.8 changes behavior for HTTP redirects (specifically 301, 307, and 308) in the client .
|
||||||
// The Docker client (and by extension docker API client) can be made to to send a request
|
// The Docker client (and by extension docker API client) can be made to send a request
|
||||||
// like POST /containers//start where what would normally be in the name section of the URL is empty.
|
// like POST /containers//start where what would normally be in the name section of the URL is empty.
|
||||||
// This triggers an HTTP 301 from the daemon.
|
// This triggers an HTTP 301 from the daemon.
|
||||||
// In go 1.8 this 301 will be converted to a GET request, and ends up getting a 404 from the daemon.
|
// In go 1.8 this 301 will be converted to a GET request, and ends up getting a 404 from the daemon.
|
||||||
|
@ -103,137 +100,6 @@ func CheckRedirect(req *http.Request, via []*http.Request) error {
|
||||||
return ErrRedirect
|
return ErrRedirect
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEnvClient initializes a new API client based on environment variables.
|
|
||||||
// See FromEnv for a list of support environment variables.
|
|
||||||
//
|
|
||||||
// Deprecated: use NewClientWithOpts(FromEnv)
|
|
||||||
func NewEnvClient() (*Client, error) {
|
|
||||||
return NewClientWithOpts(FromEnv)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 {
|
|
||||||
if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" {
|
|
||||||
options := tlsconfig.Options{
|
|
||||||
CAFile: filepath.Join(dockerCertPath, "ca.pem"),
|
|
||||||
CertFile: filepath.Join(dockerCertPath, "cert.pem"),
|
|
||||||
KeyFile: filepath.Join(dockerCertPath, "key.pem"),
|
|
||||||
InsecureSkipVerify: os.Getenv("DOCKER_TLS_VERIFY") == "",
|
|
||||||
}
|
|
||||||
tlsc, err := tlsconfig.Client(options)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
c.client = &http.Client{
|
|
||||||
Transport: &http.Transport{TLSClientConfig: tlsc},
|
|
||||||
CheckRedirect: CheckRedirect,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if host := os.Getenv("DOCKER_HOST"); host != "" {
|
|
||||||
if err := WithHost(host)(c); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if version := os.Getenv("DOCKER_API_VERSION"); version != "" {
|
|
||||||
c.version = version
|
|
||||||
c.manualOverride = true
|
|
||||||
}
|
|
||||||
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.
|
|
||||||
// Deprecated: use WithDialContext
|
|
||||||
func WithDialer(dialer *net.Dialer) func(*Client) error {
|
|
||||||
return WithDialContext(dialer.DialContext)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDialContext applies the dialer to the client transport. This can be
|
|
||||||
// used to set the Timeout and KeepAlive settings of the client.
|
|
||||||
func WithDialContext(dialContext func(ctx context.Context, network, addr string) (net.Conn, error)) func(*Client) error {
|
|
||||||
return func(c *Client) error {
|
|
||||||
if transport, ok := c.client.Transport.(*http.Transport); ok {
|
|
||||||
transport.DialContext = dialContext
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errors.Errorf("cannot apply dialer to transport: %T", c.client.Transport)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithVersion overrides the client version with the specified one
|
|
||||||
func WithVersion(version string) func(*Client) error {
|
|
||||||
return func(c *Client) error {
|
|
||||||
c.version = version
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithHost overrides the client host with the specified one.
|
|
||||||
func WithHost(host string) func(*Client) error {
|
|
||||||
return func(c *Client) error {
|
|
||||||
hostURL, err := ParseHostURL(host)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
c.host = host
|
|
||||||
c.proto = hostURL.Scheme
|
|
||||||
c.addr = hostURL.Host
|
|
||||||
c.basePath = hostURL.Path
|
|
||||||
if transport, ok := c.client.Transport.(*http.Transport); ok {
|
|
||||||
return sockets.ConfigureTransport(transport, c.proto, c.addr)
|
|
||||||
}
|
|
||||||
return errors.Errorf("cannot apply host to transport: %T", c.client.Transport)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithHTTPClient overrides the client http client with the specified one
|
|
||||||
func WithHTTPClient(client *http.Client) func(*Client) error {
|
|
||||||
return func(c *Client) error {
|
|
||||||
if client != nil {
|
|
||||||
c.client = client
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithHTTPHeaders overrides the client default http headers
|
|
||||||
func WithHTTPHeaders(headers map[string]string) func(*Client) error {
|
|
||||||
return func(c *Client) error {
|
|
||||||
c.customHTTPHeaders = headers
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewClientWithOpts initializes a new API client with default values. It takes functors
|
// NewClientWithOpts initializes a new API client with default values. It takes functors
|
||||||
// to modify values when creating it, like `NewClientWithOpts(WithVersion(…))`
|
// to modify values when creating it, like `NewClientWithOpts(WithVersion(…))`
|
||||||
// It also initializes the custom http headers to add to each request.
|
// It also initializes the custom http headers to add to each request.
|
||||||
|
@ -249,7 +115,6 @@ func NewClientWithOpts(ops ...func(*Client) error) (*Client, error) {
|
||||||
c := &Client{
|
c := &Client{
|
||||||
host: DefaultDockerHost,
|
host: DefaultDockerHost,
|
||||||
version: api.DefaultVersion,
|
version: api.DefaultVersion,
|
||||||
scheme: "http",
|
|
||||||
client: client,
|
client: client,
|
||||||
proto: defaultProto,
|
proto: defaultProto,
|
||||||
addr: defaultAddr,
|
addr: defaultAddr,
|
||||||
|
@ -264,6 +129,9 @@ func NewClientWithOpts(ops ...func(*Client) error) (*Client, error) {
|
||||||
if _, ok := c.client.Transport.(http.RoundTripper); !ok {
|
if _, ok := c.client.Transport.(http.RoundTripper); !ok {
|
||||||
return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", c.client.Transport)
|
return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", c.client.Transport)
|
||||||
}
|
}
|
||||||
|
if c.scheme == "" {
|
||||||
|
c.scheme = "http"
|
||||||
|
|
||||||
tlsConfig := resolveTLSConfig(c.client.Transport)
|
tlsConfig := resolveTLSConfig(c.client.Transport)
|
||||||
if tlsConfig != nil {
|
if tlsConfig != nil {
|
||||||
// TODO(stevvooe): This isn't really the right way to write clients in Go.
|
// TODO(stevvooe): This isn't really the right way to write clients in Go.
|
||||||
|
@ -273,6 +141,7 @@ func NewClientWithOpts(ops ...func(*Client) error) (*Client, error) {
|
||||||
// this to avoid breaking existing clients but this should be addressed.
|
// this to avoid breaking existing clients but this should be addressed.
|
||||||
c.scheme = "https"
|
c.scheme = "https"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
@ -290,18 +159,6 @@ func defaultHTTPClient(host string) (*http.Client, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient initializes a new API client for the given host and API version.
|
|
||||||
// It uses the given http client as transport.
|
|
||||||
// It also initializes the custom http headers to add to each request.
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
// server is upgraded.
|
|
||||||
// Deprecated: use NewClientWithOpts
|
|
||||||
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))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the transport used by the client
|
// Close the transport used by the client
|
||||||
func (cli *Client) Close() error {
|
func (cli *Client) Close() error {
|
||||||
if t, ok := cli.client.Transport.(*http.Transport); ok {
|
if t, ok := cli.client.Transport.(*http.Transport); ok {
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package client
|
||||||
|
|
||||||
|
import "net/http"
|
||||||
|
|
||||||
|
// NewClient initializes a new API client for the given host and API version.
|
||||||
|
// It uses the given http client as transport.
|
||||||
|
// It also initializes the custom http headers to add to each request.
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// server is upgraded.
|
||||||
|
// Deprecated: use NewClientWithOpts
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewEnvClient initializes a new API client based on environment variables.
|
||||||
|
// See FromEnv for a list of support environment variables.
|
||||||
|
//
|
||||||
|
// Deprecated: use NewClientWithOpts(FromEnv)
|
||||||
|
func NewEnvClient() (*Client, error) {
|
||||||
|
return NewClientWithOpts(FromEnv)
|
||||||
|
}
|
|
@ -0,0 +1,146 @@
|
||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/docker/go-connections/sockets"
|
||||||
|
"github.com/docker/go-connections/tlsconfig"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 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 {
|
||||||
|
if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" {
|
||||||
|
options := tlsconfig.Options{
|
||||||
|
CAFile: filepath.Join(dockerCertPath, "ca.pem"),
|
||||||
|
CertFile: filepath.Join(dockerCertPath, "cert.pem"),
|
||||||
|
KeyFile: filepath.Join(dockerCertPath, "key.pem"),
|
||||||
|
InsecureSkipVerify: os.Getenv("DOCKER_TLS_VERIFY") == "",
|
||||||
|
}
|
||||||
|
tlsc, err := tlsconfig.Client(options)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.client = &http.Client{
|
||||||
|
Transport: &http.Transport{TLSClientConfig: tlsc},
|
||||||
|
CheckRedirect: CheckRedirect,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if host := os.Getenv("DOCKER_HOST"); host != "" {
|
||||||
|
if err := WithHost(host)(c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if version := os.Getenv("DOCKER_API_VERSION"); version != "" {
|
||||||
|
if err := WithVersion(version)(c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDialer applies the dialer.DialContext to the client transport. This can be
|
||||||
|
// used to set the Timeout and KeepAlive settings of the client.
|
||||||
|
// Deprecated: use WithDialContext
|
||||||
|
func WithDialer(dialer *net.Dialer) func(*Client) error {
|
||||||
|
return WithDialContext(dialer.DialContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDialContext applies the dialer to the client transport. This can be
|
||||||
|
// used to set the Timeout and KeepAlive settings of the client.
|
||||||
|
func WithDialContext(dialContext func(ctx context.Context, network, addr string) (net.Conn, error)) func(*Client) error {
|
||||||
|
return func(c *Client) error {
|
||||||
|
if transport, ok := c.client.Transport.(*http.Transport); ok {
|
||||||
|
transport.DialContext = dialContext
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.Errorf("cannot apply dialer to transport: %T", c.client.Transport)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHost overrides the client host with the specified one.
|
||||||
|
func WithHost(host string) func(*Client) error {
|
||||||
|
return func(c *Client) error {
|
||||||
|
hostURL, err := ParseHostURL(host)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.host = host
|
||||||
|
c.proto = hostURL.Scheme
|
||||||
|
c.addr = hostURL.Host
|
||||||
|
c.basePath = hostURL.Path
|
||||||
|
if transport, ok := c.client.Transport.(*http.Transport); ok {
|
||||||
|
return sockets.ConfigureTransport(transport, c.proto, c.addr)
|
||||||
|
}
|
||||||
|
return errors.Errorf("cannot apply host to transport: %T", c.client.Transport)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHTTPClient overrides the client http client with the specified one
|
||||||
|
func WithHTTPClient(client *http.Client) func(*Client) error {
|
||||||
|
return func(c *Client) error {
|
||||||
|
if client != nil {
|
||||||
|
c.client = client
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHTTPHeaders overrides the client default http headers
|
||||||
|
func WithHTTPHeaders(headers map[string]string) func(*Client) error {
|
||||||
|
return func(c *Client) error {
|
||||||
|
c.customHTTPHeaders = headers
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithScheme overrides the client scheme with the specified one
|
||||||
|
func WithScheme(scheme string) func(*Client) error {
|
||||||
|
return func(c *Client) error {
|
||||||
|
c.scheme = scheme
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithVersion overrides the client version with the specified one
|
||||||
|
func WithVersion(version string) func(*Client) error {
|
||||||
|
return func(c *Client) error {
|
||||||
|
c.version = version
|
||||||
|
c.manualOverride = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
|
@ -176,7 +176,13 @@ func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResp
|
||||||
// this is localised - for example in French the error would be
|
// this is localised - for example in French the error would be
|
||||||
// `open //./pipe/docker_engine: Le fichier spécifié est introuvable.`
|
// `open //./pipe/docker_engine: Le fichier spécifié est introuvable.`
|
||||||
if strings.Contains(err.Error(), `open //./pipe/docker_engine`) {
|
if strings.Contains(err.Error(), `open //./pipe/docker_engine`) {
|
||||||
err = errors.New(err.Error() + " In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.")
|
// Checks if client is running with elevated privileges
|
||||||
|
if f, elevatedErr := os.Open("\\\\.\\PHYSICALDRIVE0"); elevatedErr == nil {
|
||||||
|
err = errors.Wrap(err, "In the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect.")
|
||||||
|
} else {
|
||||||
|
f.Close()
|
||||||
|
err = errors.Wrap(err, "This error may indicate that the docker daemon is not running.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return serverResp, errors.Wrap(err, "error during connect")
|
return serverResp, errors.Wrap(err, "error during connect")
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/docker/docker/pkg/idtools"
|
"github.com/docker/docker/pkg/idtools"
|
||||||
|
@ -26,7 +27,7 @@ func fixVolumePathPrefix(srcPath string) string {
|
||||||
// can't use filepath.Join(srcPath,include) because this will clean away
|
// can't use filepath.Join(srcPath,include) because this will clean away
|
||||||
// a trailing "." or "/" which may be important.
|
// a trailing "." or "/" which may be important.
|
||||||
func getWalkRoot(srcPath string, include string) string {
|
func getWalkRoot(srcPath string, include string) string {
|
||||||
return srcPath + string(filepath.Separator) + include
|
return strings.TrimSuffix(srcPath, string(filepath.Separator)) + string(filepath.Separator) + include
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanonicalTarNameForPath returns platform-specific filepath
|
// CanonicalTarNameForPath returns platform-specific filepath
|
||||||
|
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
@ -203,8 +202,6 @@ func (i *IdentityMapping) GIDs() []IDMap {
|
||||||
func createIDMap(subidRanges ranges) []IDMap {
|
func createIDMap(subidRanges ranges) []IDMap {
|
||||||
idMap := []IDMap{}
|
idMap := []IDMap{}
|
||||||
|
|
||||||
// sort the ranges by lowest ID first
|
|
||||||
sort.Sort(subidRanges)
|
|
||||||
containerID := 0
|
containerID := 0
|
||||||
for _, idrange := range subidRanges {
|
for _, idrange := range subidRanges {
|
||||||
idMap = append(idMap, IDMap{
|
idMap = append(idMap, IDMap{
|
||||||
|
|
|
@ -2,12 +2,46 @@ package mount // import "github.com/docker/docker/pkg/mount"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sort"
|
"sort"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// mountError records an error from mount or unmount operation
|
||||||
|
type mountError struct {
|
||||||
|
op string
|
||||||
|
source, target string
|
||||||
|
flags uintptr
|
||||||
|
data string
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *mountError) Error() string {
|
||||||
|
out := e.op + " "
|
||||||
|
|
||||||
|
if e.source != "" {
|
||||||
|
out += e.source + ":" + e.target
|
||||||
|
} else {
|
||||||
|
out += e.target
|
||||||
|
}
|
||||||
|
|
||||||
|
if e.flags != uintptr(0) {
|
||||||
|
out += ", flags: 0x" + strconv.FormatUint(uint64(e.flags), 16)
|
||||||
|
}
|
||||||
|
if e.data != "" {
|
||||||
|
out += ", data: " + e.data
|
||||||
|
}
|
||||||
|
|
||||||
|
out += ": " + e.err.Error()
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cause returns the underlying cause of the error
|
||||||
|
func (e *mountError) Cause() error {
|
||||||
|
return e.err
|
||||||
|
}
|
||||||
|
|
||||||
// FilterFunc is a type defining a callback function
|
// FilterFunc is a type defining a callback function
|
||||||
// to filter out unwanted entries. It takes a pointer
|
// to filter out unwanted entries. It takes a pointer
|
||||||
// to an Info struct (not fully populated, currently
|
// to an Info struct (not fully populated, currently
|
||||||
|
@ -89,12 +123,7 @@ func ForceMount(device, target, mType, options string) error {
|
||||||
// Unmount lazily unmounts a filesystem on supported platforms, otherwise
|
// Unmount lazily unmounts a filesystem on supported platforms, otherwise
|
||||||
// does a normal unmount.
|
// does a normal unmount.
|
||||||
func Unmount(target string) error {
|
func Unmount(target string) error {
|
||||||
err := unmount(target, mntDetach)
|
return unmount(target, mntDetach)
|
||||||
if err == syscall.EINVAL {
|
|
||||||
// ignore "not mounted" error
|
|
||||||
err = nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// RecursiveUnmount unmounts the target and all mounts underneath, starting with
|
// RecursiveUnmount unmounts the target and all mounts underneath, starting with
|
||||||
|
@ -114,25 +143,14 @@ func RecursiveUnmount(target string) error {
|
||||||
logrus.Debugf("Trying to unmount %s", m.Mountpoint)
|
logrus.Debugf("Trying to unmount %s", m.Mountpoint)
|
||||||
err = unmount(m.Mountpoint, mntDetach)
|
err = unmount(m.Mountpoint, mntDetach)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// If the error is EINVAL either this whole package is wrong (invalid flags passed to unmount(2)) or this is
|
if i == len(mounts)-1 { // last mount
|
||||||
// not a mountpoint (which is ok in this case).
|
|
||||||
// Meanwhile calling `Mounted()` is very expensive.
|
|
||||||
//
|
|
||||||
// We've purposefully used `syscall.EINVAL` here instead of `unix.EINVAL` to avoid platform branching
|
|
||||||
// Since `EINVAL` is defined for both Windows and Linux in the `syscall` package (and other platforms),
|
|
||||||
// this is nicer than defining a custom value that we can refer to in each platform file.
|
|
||||||
if err == syscall.EINVAL {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if i == len(mounts)-1 {
|
|
||||||
if mounted, e := Mounted(m.Mountpoint); e != nil || mounted {
|
if mounted, e := Mounted(m.Mountpoint); e != nil || mounted {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
continue
|
} else {
|
||||||
}
|
|
||||||
// This is some submount, we can ignore this error for now, the final unmount will fail if this is a real problem
|
// This is some submount, we can ignore this error for now, the final unmount will fail if this is a real problem
|
||||||
logrus.WithError(err).Warnf("Failed to unmount submount %s", m.Mountpoint)
|
logrus.WithError(err).Warnf("Failed to unmount submount %s", m.Mountpoint)
|
||||||
continue
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Debugf("Unmounted %s", m.Mountpoint)
|
logrus.Debugf("Unmounted %s", m.Mountpoint)
|
||||||
|
|
|
@ -11,11 +11,9 @@ package mount // import "github.com/docker/docker/pkg/mount"
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func allocateIOVecs(options []string) []C.struct_iovec {
|
func allocateIOVecs(options []string) []C.struct_iovec {
|
||||||
|
@ -49,12 +47,13 @@ func mount(device, target, mType string, flag uintptr, data string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if errno := C.nmount(&rawOptions[0], C.uint(len(options)), C.int(flag)); errno != 0 {
|
if errno := C.nmount(&rawOptions[0], C.uint(len(options)), C.int(flag)); errno != 0 {
|
||||||
reason := C.GoString(C.strerror(*C.__error()))
|
return &mountError{
|
||||||
return fmt.Errorf("Failed to call nmount: %s", reason)
|
op: "mount",
|
||||||
|
source: device,
|
||||||
|
target: target,
|
||||||
|
flags: flag,
|
||||||
|
err: syscall.Errno(errno),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func unmount(target string, flag int) error {
|
|
||||||
return unix.Unmount(target, flag)
|
|
||||||
}
|
|
||||||
|
|
|
@ -33,25 +33,42 @@ func mount(device, target, mType string, flags uintptr, data string) error {
|
||||||
// Initial call applying all non-propagation flags for mount
|
// Initial call applying all non-propagation flags for mount
|
||||||
// or remount with changed data
|
// or remount with changed data
|
||||||
if err := unix.Mount(device, target, mType, oflags, data); err != nil {
|
if err := unix.Mount(device, target, mType, oflags, data); err != nil {
|
||||||
return err
|
return &mountError{
|
||||||
|
op: "mount",
|
||||||
|
source: device,
|
||||||
|
target: target,
|
||||||
|
flags: oflags,
|
||||||
|
data: data,
|
||||||
|
err: err,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if flags&ptypes != 0 {
|
if flags&ptypes != 0 {
|
||||||
// Change the propagation type.
|
// Change the propagation type.
|
||||||
if err := unix.Mount("", target, "", flags&pflags, ""); err != nil {
|
if err := unix.Mount("", target, "", flags&pflags, ""); err != nil {
|
||||||
|
return &mountError{
|
||||||
|
op: "remount",
|
||||||
|
target: target,
|
||||||
|
flags: flags & pflags,
|
||||||
|
err: err,
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if oflags&broflags == broflags {
|
if oflags&broflags == broflags {
|
||||||
// Remount the bind to apply read only.
|
// Remount the bind to apply read only.
|
||||||
return unix.Mount("", target, "", oflags|unix.MS_REMOUNT, "")
|
if err := unix.Mount("", target, "", oflags|unix.MS_REMOUNT, ""); err != nil {
|
||||||
|
return &mountError{
|
||||||
|
op: "remount-ro",
|
||||||
|
target: target,
|
||||||
|
flags: oflags | unix.MS_REMOUNT,
|
||||||
|
err: err,
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func unmount(target string, flag int) error {
|
|
||||||
return unix.Unmount(target, flag)
|
|
||||||
}
|
|
||||||
|
|
|
@ -5,7 +5,3 @@ package mount // import "github.com/docker/docker/pkg/mount"
|
||||||
func mount(device, target, mType string, flag uintptr, data string) error {
|
func mount(device, target, mType string, flag uintptr, data string) error {
|
||||||
panic("Not implemented")
|
panic("Not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func unmount(target string, flag int) error {
|
|
||||||
panic("Not implemented")
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package mount // import "github.com/docker/docker/pkg/mount"
|
||||||
|
|
||||||
|
import "golang.org/x/sys/unix"
|
||||||
|
|
||||||
|
func unmount(target string, flags int) error {
|
||||||
|
err := unix.Unmount(target, flags)
|
||||||
|
if err == nil || err == unix.EINVAL {
|
||||||
|
// Ignore "not mounted" error here. Note the same error
|
||||||
|
// can be returned if flags are invalid, so this code
|
||||||
|
// assumes that the flags value is always correct.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return &mountError{
|
||||||
|
op: "umount",
|
||||||
|
target: target,
|
||||||
|
flags: uintptr(flags),
|
||||||
|
err: err,
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package mount // import "github.com/docker/docker/pkg/mount"
|
||||||
|
|
||||||
|
func unmount(target string, flag int) error {
|
||||||
|
panic("Not implemented")
|
||||||
|
}
|
|
@ -2,17 +2,12 @@
|
||||||
package stringid // import "github.com/docker/docker/pkg/stringid"
|
package stringid // import "github.com/docker/docker/pkg/stringid"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
cryptorand "crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"math"
|
|
||||||
"math/big"
|
|
||||||
"math/rand"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const shortLen = 12
|
const shortLen = 12
|
||||||
|
@ -41,10 +36,11 @@ func TruncateID(id string) string {
|
||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateID(r io.Reader) string {
|
// GenerateRandomID returns a unique id.
|
||||||
|
func GenerateRandomID() string {
|
||||||
b := make([]byte, 32)
|
b := make([]byte, 32)
|
||||||
for {
|
for {
|
||||||
if _, err := io.ReadFull(r, b); err != nil {
|
if _, err := rand.Read(b); err != nil {
|
||||||
panic(err) // This shouldn't happen
|
panic(err) // This shouldn't happen
|
||||||
}
|
}
|
||||||
id := hex.EncodeToString(b)
|
id := hex.EncodeToString(b)
|
||||||
|
@ -58,18 +54,6 @@ func generateID(r io.Reader) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenerateRandomID returns a unique id.
|
|
||||||
func GenerateRandomID() string {
|
|
||||||
return generateID(cryptorand.Reader)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenerateNonCryptoID generates unique id without using cryptographically
|
|
||||||
// secure sources of random.
|
|
||||||
// It helps you to save entropy.
|
|
||||||
func GenerateNonCryptoID() string {
|
|
||||||
return generateID(readerFunc(rand.Read))
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateID checks whether an ID string is a valid image ID.
|
// ValidateID checks whether an ID string is a valid image ID.
|
||||||
func ValidateID(id string) error {
|
func ValidateID(id string) error {
|
||||||
if ok := validHex.MatchString(id); !ok {
|
if ok := validHex.MatchString(id); !ok {
|
||||||
|
@ -77,23 +61,3 @@ func ValidateID(id string) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
// safely set the seed globally so we generate random ids. Tries to use a
|
|
||||||
// crypto seed before falling back to time.
|
|
||||||
var seed int64
|
|
||||||
if cryptoseed, err := cryptorand.Int(cryptorand.Reader, big.NewInt(math.MaxInt64)); err != nil {
|
|
||||||
// This should not happen, but worst-case fallback to time-based seed.
|
|
||||||
seed = time.Now().UnixNano()
|
|
||||||
} else {
|
|
||||||
seed = cryptoseed.Int64()
|
|
||||||
}
|
|
||||||
|
|
||||||
rand.Seed(seed)
|
|
||||||
}
|
|
||||||
|
|
||||||
type readerFunc func(p []byte) (int, error)
|
|
||||||
|
|
||||||
func (fn readerFunc) Read(p []byte) (int, error) {
|
|
||||||
return fn(p)
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package system // import "github.com/docker/docker/pkg/system"
|
||||||
|
|
||||||
|
// GetLongPathName converts Windows short pathnames to full pathnames.
|
||||||
|
// For example C:\Users\ADMIN~1 --> C:\Users\Administrator.
|
||||||
|
// It is a no-op on non-Windows platforms
|
||||||
|
func GetLongPathName(path string) (string, error) {
|
||||||
|
return path, nil
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package system // import "github.com/docker/docker/pkg/system"
|
||||||
|
|
||||||
|
import "syscall"
|
||||||
|
|
||||||
|
// GetLongPathName converts Windows short pathnames to full pathnames.
|
||||||
|
// For example C:\Users\ADMIN~1 --> C:\Users\Administrator.
|
||||||
|
// It is a no-op on non-Windows platforms
|
||||||
|
func GetLongPathName(path string) (string, error) {
|
||||||
|
// See https://groups.google.com/forum/#!topic/golang-dev/1tufzkruoTg
|
||||||
|
p := syscall.StringToUTF16(path)
|
||||||
|
b := p // GetLongPathName says we can reuse buffer
|
||||||
|
n, err := syscall.GetLongPathName(&p[0], &b[0], uint32(len(b)))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if n > uint32(len(b)) {
|
||||||
|
b = make([]uint16, n)
|
||||||
|
_, err = syscall.GetLongPathName(&p[0], &b[0], uint32(len(b)))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return syscall.UTF16ToString(b), nil
|
||||||
|
}
|
|
@ -12,7 +12,7 @@ github.com/kr/pty 5cf931ef8f
|
||||||
github.com/mattn/go-shellwords v1.0.3
|
github.com/mattn/go-shellwords v1.0.3
|
||||||
github.com/sirupsen/logrus v1.0.6
|
github.com/sirupsen/logrus v1.0.6
|
||||||
github.com/tchap/go-patricia v2.2.6
|
github.com/tchap/go-patricia v2.2.6
|
||||||
github.com/vdemeester/shakers 24d7f1d6a71aa5d9cbe7390e4afb66b7eef9e1b3
|
github.com/vdemeester/shakers 24d7f1d6a71aa5d9cbe7390e4afb66b7eef9e1b3 # v0.1.0
|
||||||
golang.org/x/net a680a1efc54dd51c040b3b5ce4939ea3cf2ea0d1
|
golang.org/x/net a680a1efc54dd51c040b3b5ce4939ea3cf2ea0d1
|
||||||
golang.org/x/sys ac767d655b305d4e9612f5f6e33120b9176c4ad4
|
golang.org/x/sys ac767d655b305d4e9612f5f6e33120b9176c4ad4
|
||||||
github.com/docker/go-units 47565b4f722fb6ceae66b95f853feed578a4a51c # v0.3.3
|
github.com/docker/go-units 47565b4f722fb6ceae66b95f853feed578a4a51c # v0.3.3
|
||||||
|
@ -26,7 +26,7 @@ github.com/imdario/mergo v0.3.6
|
||||||
golang.org/x/sync 1d60e4601c6fd243af51cc01ddf169918a5407ca
|
golang.org/x/sync 1d60e4601c6fd243af51cc01ddf169918a5407ca
|
||||||
|
|
||||||
# buildkit
|
# buildkit
|
||||||
github.com/moby/buildkit d9f75920678e35090025bb89344c5370e2efc8e7
|
github.com/moby/buildkit 05766c5c21a1e528eeb1c3522b2f05493fe9ac47 # docker-18.09 branch
|
||||||
github.com/tonistiigi/fsutil 2862f6bc5ac9b97124e552a5c108230b38a1b0ca
|
github.com/tonistiigi/fsutil 2862f6bc5ac9b97124e552a5c108230b38a1b0ca
|
||||||
github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746
|
github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746
|
||||||
github.com/opentracing/opentracing-go 1361b9cd60be79c4c3a7fa9841b3c132e40066a7
|
github.com/opentracing/opentracing-go 1361b9cd60be79c4c3a7fa9841b3c132e40066a7
|
||||||
|
@ -37,7 +37,7 @@ github.com/mitchellh/hashstructure 2bca23e0e452137f789efbc8610126fd8b94f73b
|
||||||
#get libnetwork packages
|
#get libnetwork packages
|
||||||
|
|
||||||
# When updating, also update LIBNETWORK_COMMIT in hack/dockerfile/install/proxy accordingly
|
# When updating, also update LIBNETWORK_COMMIT in hack/dockerfile/install/proxy accordingly
|
||||||
github.com/docker/libnetwork 4725f2163fb214a6312f3beae5991f838ec36326 # bump_18.09 branch
|
github.com/docker/libnetwork 55685ba49593e67f5e1c8180539379b16736c25e # bump_18.09 branch
|
||||||
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
||||||
github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80
|
github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80
|
||||||
github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
|
github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
|
||||||
|
@ -55,9 +55,9 @@ github.com/vishvananda/netlink b2de5d10e38ecce8607e6b438b6d174f389a004e
|
||||||
github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
|
github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
|
||||||
github.com/samuel/go-zookeeper d0e0d8e11f318e000a8cc434616d69e329edc374
|
github.com/samuel/go-zookeeper d0e0d8e11f318e000a8cc434616d69e329edc374
|
||||||
github.com/deckarep/golang-set ef32fa3046d9f249d399f98ebaf9be944430fd1d
|
github.com/deckarep/golang-set ef32fa3046d9f249d399f98ebaf9be944430fd1d
|
||||||
github.com/coreos/etcd v3.2.1
|
github.com/coreos/etcd v3.3.9
|
||||||
github.com/coreos/go-semver v0.2.0
|
github.com/coreos/go-semver v0.2.0
|
||||||
github.com/ugorji/go f1f1a805ed361a0e078bb537e4ea78cd37dcf065
|
github.com/ugorji/go v1.1.1
|
||||||
github.com/hashicorp/consul v0.5.2
|
github.com/hashicorp/consul v0.5.2
|
||||||
github.com/miekg/dns v1.0.7
|
github.com/miekg/dns v1.0.7
|
||||||
github.com/ishidawataru/sctp 07191f837fedd2f13d1ec7b5f885f0f3ec54b1cb
|
github.com/ishidawataru/sctp 07191f837fedd2f13d1ec7b5f885f0f3ec54b1cb
|
||||||
|
@ -121,7 +121,7 @@ google.golang.org/genproto 694d95ba50e67b2e363f3483057db5d4910c18f9
|
||||||
github.com/containerd/containerd 9754871865f7fe2f4e74d43e2fc7ccd237edcbce # v1.2.2
|
github.com/containerd/containerd 9754871865f7fe2f4e74d43e2fc7ccd237edcbce # v1.2.2
|
||||||
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
|
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
|
||||||
github.com/containerd/continuity 004b46473808b3e7a4a3049c20e4376c91eb966d
|
github.com/containerd/continuity 004b46473808b3e7a4a3049c20e4376c91eb966d
|
||||||
github.com/containerd/cgroups dbea6f2bd41658b84b00417ceefa416b979cbf10
|
github.com/containerd/cgroups 4994991857f9b0ae8dc439551e8bebdbb4bf66c1
|
||||||
github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23
|
github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23
|
||||||
github.com/containerd/cri 0d5cabd006cb5319dc965046067b8432d9fa5ef8 # release/1.2 branch
|
github.com/containerd/cri 0d5cabd006cb5319dc965046067b8432d9fa5ef8 # release/1.2 branch
|
||||||
github.com/containerd/go-runc 5a6d9f37cfa36b15efba46dc7ea349fa9b7143c3
|
github.com/containerd/go-runc 5a6d9f37cfa36b15efba46dc7ea349fa9b7143c3
|
||||||
|
@ -130,7 +130,7 @@ github.com/containerd/ttrpc 2a805f71863501300ae1976d29f0454ae003e85a
|
||||||
github.com/gogo/googleapis 08a7655d27152912db7aaf4f983275eaf8d128ef
|
github.com/gogo/googleapis 08a7655d27152912db7aaf4f983275eaf8d128ef
|
||||||
|
|
||||||
# cluster
|
# cluster
|
||||||
github.com/docker/swarmkit c66ed60822d3fc3bf6e17a505ee79014f449ef05 # bump_v18.09 branch
|
github.com/docker/swarmkit 142a73731c850daf24d32001aa2358b6ffe36eab # bump_v18.09 branch
|
||||||
github.com/gogo/protobuf v1.0.0
|
github.com/gogo/protobuf v1.0.0
|
||||||
github.com/cloudflare/cfssl 1.3.2
|
github.com/cloudflare/cfssl 1.3.2
|
||||||
github.com/fernet/fernet-go 1b2437bc582b3cfbb341ee5a29f8ef5b42912ff2
|
github.com/fernet/fernet-go 1b2437bc582b3cfbb341ee5a29f8ef5b42912ff2
|
||||||
|
@ -140,13 +140,13 @@ golang.org/x/time fbb02b2291d28baffd63558aa44b4b56f178d650
|
||||||
github.com/hashicorp/go-memdb cb9a474f84cc5e41b273b20c6927680b2a8776ad
|
github.com/hashicorp/go-memdb cb9a474f84cc5e41b273b20c6927680b2a8776ad
|
||||||
github.com/hashicorp/go-immutable-radix 826af9ccf0feeee615d546d69b11f8e98da8c8f1 git://github.com/tonistiigi/go-immutable-radix.git
|
github.com/hashicorp/go-immutable-radix 826af9ccf0feeee615d546d69b11f8e98da8c8f1 git://github.com/tonistiigi/go-immutable-radix.git
|
||||||
github.com/hashicorp/golang-lru 0fb14efe8c47ae851c0034ed7a448854d3d34cf3
|
github.com/hashicorp/golang-lru 0fb14efe8c47ae851c0034ed7a448854d3d34cf3
|
||||||
github.com/coreos/pkg fa29b1d70f0beaddd4c7021607cc3c3be8ce94b8
|
github.com/coreos/pkg v3
|
||||||
github.com/pivotal-golang/clock 3fd3c1944c59d9742e1cd333672181cd1a6f9fa0
|
github.com/pivotal-golang/clock 3fd3c1944c59d9742e1cd333672181cd1a6f9fa0
|
||||||
github.com/prometheus/client_golang 52437c81da6b127a9925d17eb3a382a2e5fd395e
|
github.com/prometheus/client_golang v0.8.0
|
||||||
github.com/beorn7/perks 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9
|
github.com/beorn7/perks 3a771d992973f24aa725d07868b467d1ddfceaf
|
||||||
github.com/prometheus/client_model fa8ad6fec33561be4280a8f0514318c79d7f6cb6
|
github.com/prometheus/client_model 6f3806018612930941127f2a7c6c453ba2c527d2
|
||||||
github.com/prometheus/common ebdfc6da46522d58825777cf1f90490a5b1ef1d8
|
github.com/prometheus/common 7600349dcfe1abd18d72d3a1770870d9800a7801
|
||||||
github.com/prometheus/procfs abf152e5f3e97f2fafac028d2cc06c1feb87ffa5
|
github.com/prometheus/procfs 7d6f385de8bea29190f15ba9931442a0eaef9af7
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.0
|
github.com/matttproud/golang_protobuf_extensions v1.0.0
|
||||||
github.com/pkg/errors 645ef00459ed84a119197bfb8d8205042c6df63d # v0.8.0
|
github.com/pkg/errors 645ef00459ed84a119197bfb8d8205042c6df63d # v0.8.0
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||||
|
@ -161,9 +161,3 @@ github.com/Nvveen/Gotty a8b993ba6abdb0e0c12b0125c603323a71c7790c https://github.
|
||||||
github.com/docker/go-metrics d466d4f6fd960e01820085bd7e1a24426ee7ef18
|
github.com/docker/go-metrics d466d4f6fd960e01820085bd7e1a24426ee7ef18
|
||||||
|
|
||||||
github.com/opencontainers/selinux b6fa367ed7f534f9ba25391cc2d467085dbb445a
|
github.com/opencontainers/selinux b6fa367ed7f534f9ba25391cc2d467085dbb445a
|
||||||
|
|
||||||
|
|
||||||
# archive/tar (for Go 1.10, see https://github.com/golang/go/issues/24787)
|
|
||||||
# mkdir -p ./vendor/archive
|
|
||||||
# git clone -b go-1.10 --depth=1 git@github.com:kolyshkin/go-tar.git ./vendor/archive/tar
|
|
||||||
# vndr # to clean up test files
|
|
||||||
|
|
Loading…
Reference in New Issue