13 // DefaultHTTPPort Default HTTP Port used if only the protocol is provided to -H flag e.g. docker daemon -H tcp://
14 // TODO Windows. DefaultHTTPPort is only used on Windows if a -H parameter
15 // is not supplied. A better longer term solution would be to use a named
16 // pipe as the default on the Windows daemon.
17 // These are the IANA registered port numbers for use with Docker
18 // see http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=docker
19 DefaultHTTPPort = 2375 // Default HTTP Port
20 // DefaultTLSHTTPPort Default HTTP Port used when TLS enabled
21 DefaultTLSHTTPPort = 2376 // Default TLS encrypted HTTP Port
22 // DefaultUnixSocket Path for the unix socket.
23 // Docker daemon by default always listens on the default unix socket
24 DefaultUnixSocket = "/var/run/docker.sock"
25 // DefaultTCPHost constant defines the default host string used by docker on Windows
26 DefaultTCPHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultHTTPPort)
27 // DefaultTLSHost constant defines the default host string used by docker for TLS sockets
28 DefaultTLSHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultTLSHTTPPort)
31 // ValidateHost validates that the specified string is a valid host and returns it.
32 func ValidateHost(val string) (string, error) {
33 _, err := parseDockerDaemonHost(DefaultTCPHost, DefaultTLSHost, DefaultUnixSocket, "", val)
37 // Note: unlike most flag validators, we don't return the mutated value here
38 // we need to know what the user entered later (using ParseHost) to adjust for tls
42 // ParseHost and set defaults for a Daemon host string
43 func ParseHost(defaultHost, val string) (string, error) {
44 host, err := parseDockerDaemonHost(DefaultTCPHost, DefaultTLSHost, DefaultUnixSocket, defaultHost, val)
51 // parseDockerDaemonHost parses the specified address and returns an address that will be used as the host.
52 // Depending of the address specified, will use the defaultTCPAddr or defaultUnixAddr
53 // defaultUnixAddr must be a absolute file path (no `unix://` prefix)
54 // defaultTCPAddr must be the full `tcp://host:port` form
55 func parseDockerDaemonHost(defaultTCPAddr, defaultTLSHost, defaultUnixAddr, defaultAddr, addr string) (string, error) {
56 addr = strings.TrimSpace(addr)
58 if defaultAddr == defaultTLSHost {
59 return defaultTLSHost, nil
61 if runtime.GOOS != "windows" {
62 return fmt.Sprintf("unix://%s", defaultUnixAddr), nil
64 return defaultTCPAddr, nil
66 addrParts := strings.Split(addr, "://")
67 if len(addrParts) == 1 {
68 addrParts = []string{"tcp", addrParts[0]}
73 return parseTCPAddr(addrParts[1], defaultTCPAddr)
75 return parseUnixAddr(addrParts[1], defaultUnixAddr)
79 return "", fmt.Errorf("Invalid bind address format: %s", addr)
83 // parseUnixAddr parses and validates that the specified address is a valid UNIX
84 // socket address. It returns a formatted UNIX socket address, either using the
85 // address parsed from addr, or the contents of defaultAddr if addr is a blank
87 func parseUnixAddr(addr string, defaultAddr string) (string, error) {
88 addr = strings.TrimPrefix(addr, "unix://")
89 if strings.Contains(addr, "://") {
90 return "", fmt.Errorf("Invalid proto, expected unix: %s", addr)
95 return fmt.Sprintf("unix://%s", addr), nil
98 // parseTCPAddr parses and validates that the specified address is a valid TCP
99 // address. It returns a formatted TCP address, either using the address parsed
100 // from tryAddr, or the contents of defaultAddr if tryAddr is a blank string.
101 // tryAddr is expected to have already been Trim()'d
102 // defaultAddr must be in the full `tcp://host:port` form
103 func parseTCPAddr(tryAddr string, defaultAddr string) (string, error) {
104 if tryAddr == "" || tryAddr == "tcp://" {
105 return defaultAddr, nil
107 addr := strings.TrimPrefix(tryAddr, "tcp://")
108 if strings.Contains(addr, "://") || addr == "" {
109 return "", fmt.Errorf("Invalid proto, expected tcp: %s", tryAddr)
112 defaultAddr = strings.TrimPrefix(defaultAddr, "tcp://")
113 defaultHost, defaultPort, err := net.SplitHostPort(defaultAddr)
117 // url.Parse fails for trailing colon on IPv6 brackets on Go 1.5, but
118 // not 1.4. See https://github.com/golang/go/issues/12200 and
119 // https://github.com/golang/go/issues/6530.
120 if strings.HasSuffix(addr, "]:") {
124 u, err := url.Parse("tcp://" + addr)
129 host, port, err := net.SplitHostPort(u.Host)
131 return "", fmt.Errorf("Invalid bind address format: %s", tryAddr)
140 p, err := strconv.Atoi(port)
141 if err != nil && p == 0 {
142 return "", fmt.Errorf("Invalid bind address format: %s", tryAddr)
145 return fmt.Sprintf("tcp://%s%s", net.JoinHostPort(host, port), u.Path), nil