summaryrefslogtreecommitdiff
path: root/docker/docker.go
diff options
context:
space:
mode:
Diffstat (limited to 'docker/docker.go')
-rw-r--r--docker/docker.go77
1 files changed, 73 insertions, 4 deletions
diff --git a/docker/docker.go b/docker/docker.go
index 2aa10dbe54..e96c173d30 100644
--- a/docker/docker.go
+++ b/docker/docker.go
@@ -1,21 +1,35 @@
package main
import (
+ "crypto/tls"
+ "crypto/x509"
"fmt"
+ "io/ioutil"
"log"
"os"
"strings"
"github.com/dotcloud/docker/api"
+ "github.com/dotcloud/docker/api/client"
"github.com/dotcloud/docker/builtins"
"github.com/dotcloud/docker/dockerversion"
"github.com/dotcloud/docker/engine"
+ "github.com/dotcloud/docker/opts"
flag "github.com/dotcloud/docker/pkg/mflag"
- "github.com/dotcloud/docker/pkg/opts"
"github.com/dotcloud/docker/sysinit"
"github.com/dotcloud/docker/utils"
)
+const (
+ defaultCaFile = "ca.pem"
+ defaultKeyFile = "key.pem"
+ defaultCertFile = "cert.pem"
+)
+
+var (
+ dockerConfDir = os.Getenv("HOME") + "/.docker/"
+)
+
func main() {
if selfPath := utils.SelfPath(); strings.Contains(selfPath, ".dockerinit") {
// Running in init mode
@@ -35,16 +49,23 @@ func main() {
flSocketGroup = flag.String([]string{"G", "-group"}, "docker", "Group to assign the unix socket specified by -H when running in daemon mode; use '' (the empty string) to disable setting of a group")
flEnableCors = flag.Bool([]string{"#api-enable-cors", "-api-enable-cors"}, false, "Enable CORS headers in the remote API")
flDns = opts.NewListOpts(opts.ValidateIp4Address)
- flEnableIptables = flag.Bool([]string{"#iptables", "-iptables"}, true, "Disable docker's addition of iptables rules")
- flEnableIpForward = flag.Bool([]string{"#ip-forward", "-ip-forward"}, true, "Disable enabling of net.ipv4.ip_forward")
+ flDnsSearch = opts.NewListOpts(opts.ValidateDomain)
+ flEnableIptables = flag.Bool([]string{"#iptables", "-iptables"}, true, "Enable Docker's addition of iptables rules")
+ flEnableIpForward = flag.Bool([]string{"#ip-forward", "-ip-forward"}, true, "Enable net.ipv4.ip_forward")
flDefaultIp = flag.String([]string{"#ip", "-ip"}, "0.0.0.0", "Default IP address to use when binding container ports")
flInterContainerComm = flag.Bool([]string{"#icc", "-icc"}, true, "Enable inter-container communication")
flGraphDriver = flag.String([]string{"s", "-storage-driver"}, "", "Force the docker runtime to use a specific storage driver")
flExecDriver = flag.String([]string{"e", "-exec-driver"}, "native", "Force the docker runtime to use a specific exec driver")
flHosts = opts.NewListOpts(api.ValidateHost)
flMtu = flag.Int([]string{"#mtu", "-mtu"}, 0, "Set the containers network MTU; if no value is provided: default to the default route MTU or 1500 if no default route is available")
+ flTls = flag.Bool([]string{"-tls"}, false, "Use TLS; implied by tls-verify flags")
+ flTlsVerify = flag.Bool([]string{"-tlsverify"}, false, "Use TLS and verify the remote (daemon: verify client, client: verify daemon)")
+ flCa = flag.String([]string{"-tlscacert"}, dockerConfDir+defaultCaFile, "Trust only remotes providing a certificate signed by the CA given here")
+ flCert = flag.String([]string{"-tlscert"}, dockerConfDir+defaultCertFile, "Path to TLS certificate file")
+ flKey = flag.String([]string{"-tlskey"}, dockerConfDir+defaultKeyFile, "Path to TLS key file")
)
flag.Var(&flDns, []string{"#dns", "-dns"}, "Force docker to use specific DNS servers")
+ flag.Var(&flDnsSearch, []string{"-dns-search"}, "Force Docker to use specific DNS search domains")
flag.Var(&flHosts, []string{"H", "-host"}, "tcp://host:port, unix://path/to/socket, fd://* or fd://socketfd to use in daemon mode. Multiple sockets can be specified")
flag.Parse()
@@ -73,6 +94,7 @@ func main() {
if *flDebug {
os.Setenv("DEBUG", "1")
}
+
if *flDaemon {
if flag.NArg() != 0 {
flag.Usage()
@@ -115,6 +137,7 @@ func main() {
job.Setenv("Root", realRoot)
job.SetenvBool("AutoRestart", *flAutoRestart)
job.SetenvList("Dns", flDns.GetAll())
+ job.SetenvList("DnsSearch", flDnsSearch.GetAll())
job.SetenvBool("EnableIptables", *flEnableIptables)
job.SetenvBool("EnableIpForward", *flEnableIpForward)
job.Setenv("BridgeIface", *bridgeName)
@@ -140,6 +163,12 @@ func main() {
job.SetenvBool("EnableCors", *flEnableCors)
job.Setenv("Version", dockerversion.VERSION)
job.Setenv("SocketGroup", *flSocketGroup)
+
+ job.SetenvBool("Tls", *flTls)
+ job.SetenvBool("TlsVerify", *flTlsVerify)
+ job.Setenv("TlsCa", *flCa)
+ job.Setenv("TlsCert", *flCert)
+ job.Setenv("TlsKey", *flKey)
if err := job.Run(); err != nil {
log.Fatal(err)
}
@@ -148,7 +177,47 @@ func main() {
log.Fatal("Please specify only one -H")
}
protoAddrParts := strings.SplitN(flHosts.GetAll()[0], "://", 2)
- if err := api.ParseCommands(protoAddrParts[0], protoAddrParts[1], flag.Args()...); err != nil {
+
+ var (
+ cli *client.DockerCli
+ tlsConfig tls.Config
+ )
+ tlsConfig.InsecureSkipVerify = true
+
+ // If we should verify the server, we need to load a trusted ca
+ if *flTlsVerify {
+ *flTls = true
+ certPool := x509.NewCertPool()
+ file, err := ioutil.ReadFile(*flCa)
+ if err != nil {
+ log.Fatalf("Couldn't read ca cert %s: %s", *flCa, err)
+ }
+ certPool.AppendCertsFromPEM(file)
+ tlsConfig.RootCAs = certPool
+ tlsConfig.InsecureSkipVerify = false
+ }
+
+ // If tls is enabled, try to load and send client certificates
+ if *flTls || *flTlsVerify {
+ _, errCert := os.Stat(*flCert)
+ _, errKey := os.Stat(*flKey)
+ if errCert == nil && errKey == nil {
+ *flTls = true
+ cert, err := tls.LoadX509KeyPair(*flCert, *flKey)
+ if err != nil {
+ log.Fatalf("Couldn't load X509 key pair: %s. Key encrypted?", err)
+ }
+ tlsConfig.Certificates = []tls.Certificate{cert}
+ }
+ }
+
+ if *flTls || *flTlsVerify {
+ cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], &tlsConfig)
+ } else {
+ cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], nil)
+ }
+
+ if err := cli.ParseCommands(flag.Args()...); err != nil {
if sterr, ok := err.(*utils.StatusError); ok {
if sterr.Status != "" {
log.Println(sterr.Status)