mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
7321067176
This changes the way the exec drivers work by not specifing a -driver flag on reexec. For each of the exec drivers they register their own functions that will be matched aginst the argv 0 on exec and called if they match. This also allows any functionality to be added to docker so that the binary can be reexec'd and any type of function can be called. I moved the flag parsing on docker exec to the specific initializers so that the implementations do not bleed into one another. This also allows for more flexability within reexec initializers to specify their own flags and options. Signed-off-by: Michael Crosby <michael@docker.com>
102 lines
3 KiB
Go
102 lines
3 KiB
Go
// +build daemon
|
|
|
|
package main
|
|
|
|
import (
|
|
"log"
|
|
"net"
|
|
|
|
"github.com/docker/docker/builtins"
|
|
_ "github.com/docker/docker/daemon/execdriver/lxc"
|
|
_ "github.com/docker/docker/daemon/execdriver/native"
|
|
"github.com/docker/docker/dockerversion"
|
|
"github.com/docker/docker/engine"
|
|
flag "github.com/docker/docker/pkg/mflag"
|
|
"github.com/docker/docker/pkg/signal"
|
|
)
|
|
|
|
const CanDaemon = true
|
|
|
|
func mainDaemon() {
|
|
if flag.NArg() != 0 {
|
|
flag.Usage()
|
|
return
|
|
}
|
|
|
|
if *bridgeName != "" && *bridgeIp != "" {
|
|
log.Fatal("You specified -b & --bip, mutually exclusive options. Please specify only one.")
|
|
}
|
|
|
|
if !*flEnableIptables && !*flInterContainerComm {
|
|
log.Fatal("You specified --iptables=false with --icc=false. ICC uses iptables to function. Please set --icc or --iptables to true.")
|
|
}
|
|
|
|
if net.ParseIP(*flDefaultIp) == nil {
|
|
log.Fatalf("Specified --ip=%s is not in correct format \"0.0.0.0\".", *flDefaultIp)
|
|
}
|
|
|
|
eng := engine.New()
|
|
signal.Trap(eng.Shutdown)
|
|
// Load builtins
|
|
if err := builtins.Register(eng); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
// load the daemon in the background so we can immediately start
|
|
// the http api so that connections don't fail while the daemon
|
|
// is booting
|
|
go func() {
|
|
// Load plugin: httpapi
|
|
job := eng.Job("initserver")
|
|
// include the variable here too, for the server config
|
|
job.Setenv("Pidfile", *pidfile)
|
|
job.Setenv("Root", *flRoot)
|
|
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)
|
|
job.Setenv("BridgeIP", *bridgeIp)
|
|
job.Setenv("DefaultIp", *flDefaultIp)
|
|
job.SetenvBool("InterContainerCommunication", *flInterContainerComm)
|
|
job.Setenv("GraphDriver", *flGraphDriver)
|
|
job.SetenvList("GraphOptions", flGraphOpts.GetAll())
|
|
job.Setenv("ExecDriver", *flExecDriver)
|
|
job.SetenvInt("Mtu", *flMtu)
|
|
job.SetenvBool("EnableSelinuxSupport", *flSelinuxEnabled)
|
|
job.SetenvList("Sockets", flHosts.GetAll())
|
|
if err := job.Run(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
// after the daemon is done setting up we can tell the api to start
|
|
// accepting connections
|
|
if err := eng.Job("acceptconnections").Run(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}()
|
|
|
|
// TODO actually have a resolved graphdriver to show?
|
|
log.Printf("docker daemon: %s %s; execdriver: %s; graphdriver: %s",
|
|
dockerversion.VERSION,
|
|
dockerversion.GITCOMMIT,
|
|
*flExecDriver,
|
|
*flGraphDriver)
|
|
|
|
// Serve api
|
|
job := eng.Job("serveapi", flHosts.GetAll()...)
|
|
job.SetenvBool("Logging", true)
|
|
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)
|
|
job.SetenvBool("BufferRequests", true)
|
|
if err := job.Run(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|