mirror of https://github.com/docker/docs.git
Merge pull request #14304 from vieux/http_proxy_support
add support for base path in docker cli -H
This commit is contained in:
commit
4e9280ffdb
|
@ -7,6 +7,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
@ -24,6 +25,8 @@ type DockerCli struct {
|
||||||
proto string
|
proto string
|
||||||
// addr holds the client address.
|
// addr holds the client address.
|
||||||
addr string
|
addr string
|
||||||
|
// basePath holds the path to prepend to the requests
|
||||||
|
basePath string
|
||||||
|
|
||||||
// configFile has the client configuration file
|
// configFile has the client configuration file
|
||||||
configFile *cliconfig.ConfigFile
|
configFile *cliconfig.ConfigFile
|
||||||
|
@ -187,6 +190,7 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a
|
||||||
isTerminalIn = false
|
isTerminalIn = false
|
||||||
isTerminalOut = false
|
isTerminalOut = false
|
||||||
scheme = "http"
|
scheme = "http"
|
||||||
|
basePath = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
if tlsConfig != nil {
|
if tlsConfig != nil {
|
||||||
|
@ -215,9 +219,17 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a
|
||||||
fmt.Fprintf(err, "WARNING: Error loading config file:%v\n", e)
|
fmt.Fprintf(err, "WARNING: Error loading config file:%v\n", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if proto == "tcp" {
|
||||||
|
// error is checked in pkg/parsers already
|
||||||
|
parsed, _ := url.Parse("tcp://" + addr)
|
||||||
|
addr = parsed.Host
|
||||||
|
basePath = parsed.Path
|
||||||
|
}
|
||||||
|
|
||||||
return &DockerCli{
|
return &DockerCli{
|
||||||
proto: proto,
|
proto: proto,
|
||||||
addr: addr,
|
addr: addr,
|
||||||
|
basePath: basePath,
|
||||||
configFile: configFile,
|
configFile: configFile,
|
||||||
in: in,
|
in: in,
|
||||||
out: out,
|
out: out,
|
||||||
|
|
|
@ -138,7 +138,7 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.Version, path), params)
|
req, err := http.NewRequest(method, fmt.Sprintf("%s/v%s%s", cli.basePath, api.Version, path), params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ func (cli *DockerCli) clientRequest(method, path string, in io.Reader, headers m
|
||||||
if expectedPayload && in == nil {
|
if expectedPayload && in == nil {
|
||||||
in = bytes.NewReader([]byte{})
|
in = bytes.NewReader([]byte{})
|
||||||
}
|
}
|
||||||
req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.Version, path), in)
|
req, err := http.NewRequest(method, fmt.Sprintf("%s/v%s%s", cli.basePath, api.Version, path), in)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return serverResp, err
|
return serverResp, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,12 +83,14 @@ Similarly, the Docker client can use `-H` to connect to a custom port.
|
||||||
|
|
||||||
`-H` accepts host and port assignment in the following format:
|
`-H` accepts host and port assignment in the following format:
|
||||||
|
|
||||||
tcp://[host][:port] or unix://path
|
tcp://[host][:port][path] or unix://path
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
- `tcp://host:2375` -> TCP connection on
|
- `tcp://host:2375` -> TCP connection on
|
||||||
host:2375
|
host:2375
|
||||||
|
- `tcp://host:2375/path` -> TCP connection on
|
||||||
|
host:2375 and prepend path to all requests
|
||||||
- `unix://path/to/socket` -> Unix socket located
|
- `unix://path/to/socket` -> Unix socket located
|
||||||
at `path/to/socket`
|
at `path/to/socket`
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package parsers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/url"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -52,7 +53,11 @@ func ParseTCPAddr(addr string, defaultAddr string) (string, error) {
|
||||||
return "", fmt.Errorf("Invalid proto, expected tcp: %s", addr)
|
return "", fmt.Errorf("Invalid proto, expected tcp: %s", addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
hostParts := strings.Split(addr, ":")
|
u, err := url.Parse("tcp://" + addr)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
hostParts := strings.Split(u.Host, ":")
|
||||||
if len(hostParts) != 2 {
|
if len(hostParts) != 2 {
|
||||||
return "", fmt.Errorf("Invalid bind address format: %s", addr)
|
return "", fmt.Errorf("Invalid bind address format: %s", addr)
|
||||||
}
|
}
|
||||||
|
@ -65,7 +70,7 @@ func ParseTCPAddr(addr string, defaultAddr string) (string, error) {
|
||||||
if err != nil && p == 0 {
|
if err != nil && p == 0 {
|
||||||
return "", fmt.Errorf("Invalid bind address format: %s", addr)
|
return "", fmt.Errorf("Invalid bind address format: %s", addr)
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("tcp://%s:%d", host, p), nil
|
return fmt.Sprintf("tcp://%s:%d%s", host, p, u.Path), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get a repos name and returns the right reposName + tag|digest
|
// Get a repos name and returns the right reposName + tag|digest
|
||||||
|
|
|
@ -14,14 +14,18 @@ func TestParseHost(t *testing.T) {
|
||||||
"0.0.0.0": "Invalid bind address format: 0.0.0.0",
|
"0.0.0.0": "Invalid bind address format: 0.0.0.0",
|
||||||
"tcp://": "Invalid proto, expected tcp: ",
|
"tcp://": "Invalid proto, expected tcp: ",
|
||||||
"tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d",
|
"tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d",
|
||||||
|
"tcp:a.b.c.d/path": "Invalid bind address format: tcp:a.b.c.d/path",
|
||||||
"udp://127.0.0.1": "Invalid bind address format: udp://127.0.0.1",
|
"udp://127.0.0.1": "Invalid bind address format: udp://127.0.0.1",
|
||||||
"udp://127.0.0.1:2375": "Invalid bind address format: udp://127.0.0.1:2375",
|
"udp://127.0.0.1:2375": "Invalid bind address format: udp://127.0.0.1:2375",
|
||||||
}
|
}
|
||||||
valids := map[string]string{
|
valids := map[string]string{
|
||||||
"0.0.0.1:5555": "tcp://0.0.0.1:5555",
|
"0.0.0.1:5555": "tcp://0.0.0.1:5555",
|
||||||
":6666": "tcp://127.0.0.1:6666",
|
"0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path",
|
||||||
"tcp://:7777": "tcp://127.0.0.1:7777",
|
":6666": "tcp://127.0.0.1:6666",
|
||||||
"": "unix:///var/run/docker.sock",
|
":6666/path": "tcp://127.0.0.1:6666/path",
|
||||||
|
"tcp://:7777": "tcp://127.0.0.1:7777",
|
||||||
|
"tcp://:7777/path": "tcp://127.0.0.1:7777/path",
|
||||||
|
"": "unix:///var/run/docker.sock",
|
||||||
"unix:///run/docker.sock": "unix:///run/docker.sock",
|
"unix:///run/docker.sock": "unix:///run/docker.sock",
|
||||||
"unix://": "unix:///var/run/docker.sock",
|
"unix://": "unix:///var/run/docker.sock",
|
||||||
"fd://": "fd://",
|
"fd://": "fd://",
|
||||||
|
|
Loading…
Reference in New Issue