2013-01-20 00:07:19 +00:00
package main
import (
2013-04-10 10:24:15 +00:00
"fmt"
2013-03-13 07:29:40 +00:00
"github.com/dotcloud/docker"
2014-01-29 19:26:54 +00:00
"github.com/dotcloud/docker/api"
2013-11-07 20:19:24 +00:00
"github.com/dotcloud/docker/engine"
2013-12-23 19:43:54 +00:00
flag "github.com/dotcloud/docker/pkg/mflag"
2013-10-10 08:53:38 +00:00
"github.com/dotcloud/docker/sysinit"
2013-05-14 22:37:35 +00:00
"github.com/dotcloud/docker/utils"
2013-01-20 00:07:19 +00:00
"log"
"os"
2013-05-23 16:09:28 +00:00
"strings"
2013-01-24 07:14:46 +00:00
)
2013-04-11 19:58:23 +00:00
var (
2013-06-04 18:00:22 +00:00
GITCOMMIT string
2013-08-26 15:45:52 +00:00
VERSION string
2013-04-11 19:58:23 +00:00
)
2013-04-01 18:12:56 +00:00
2013-01-20 00:07:19 +00:00
func main ( ) {
2013-06-14 23:56:08 +00:00
if selfPath := utils . SelfPath ( ) ; selfPath == "/sbin/init" || selfPath == "/.dockerinit" {
2013-03-13 07:29:40 +00:00
// Running in init mode
2013-10-10 08:53:38 +00:00
sysinit . SysInit ( )
2013-03-13 07:29:40 +00:00
return
2013-01-25 19:26:18 +00:00
}
2013-11-26 17:46:06 +00:00
2013-11-26 17:47:58 +00:00
var (
2013-12-23 19:43:54 +00:00
flVersion = flag . Bool ( [ ] string { "v" , "-version" } , false , "Print version information and quit" )
flDaemon = flag . Bool ( [ ] string { "d" , "-daemon" } , false , "Enable daemon mode" )
flDebug = flag . Bool ( [ ] string { "D" , "-debug" } , false , "Enable debug mode" )
flAutoRestart = flag . Bool ( [ ] string { "r" , "-restart" } , true , "Restart previously running containers" )
bridgeName = flag . String ( [ ] string { "b" , "-bridge" } , "" , "Attach containers to a pre-existing network bridge; use 'none' to disable container networking" )
bridgeIp = flag . String ( [ ] string { "#bip" , "-bip" } , "" , "Use this CIDR notation address for the network bridge's IP, not compatible with -b" )
pidfile = flag . String ( [ ] string { "p" , "-pidfile" } , "/var/run/docker.pid" , "Path to use for daemon PID file" )
flRoot = flag . String ( [ ] string { "g" , "-graph" } , "/var/lib/docker" , "Path to use as the root of the docker runtime" )
flEnableCors = flag . Bool ( [ ] string { "#api-enable-cors" , "-api-enable-cors" } , false , "Enable CORS headers in the remote API" )
2013-11-22 17:55:27 +00:00
flDns = docker . NewListOpts ( docker . ValidateIp4Address )
2013-12-23 19:43:54 +00:00
flEnableIptables = flag . Bool ( [ ] string { "#iptables" , "-iptables" } , true , "Disable docker's addition of iptables rules" )
2014-01-28 04:35:05 +00:00
flEnableIpForward = flag . Bool ( [ ] string { "#ip-forward" , "-ip-forward" } , true , "Disable enabling of net.ipv4.ip_forward" )
2013-12-23 19:43:54 +00:00
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" )
2013-11-26 17:50:43 +00:00
flHosts = docker . NewListOpts ( docker . ValidateHost )
2013-12-23 19:43:54 +00:00
flMtu = flag . Int ( [ ] string { "#mtu" , "-mtu" } , docker . DefaultNetworkMtu , "Set the containers network mtu" )
2013-11-26 17:47:58 +00:00
)
2013-12-23 19:43:54 +00:00
flag . Var ( & flDns , [ ] string { "#dns" , "-dns" } , "Force docker to use specific DNS servers" )
2014-01-21 20:47:27 +00:00
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" )
2013-10-05 02:25:15 +00:00
2013-03-13 07:29:40 +00:00
flag . Parse ( )
2013-10-05 02:25:15 +00:00
2013-08-07 03:51:12 +00:00
if * flVersion {
showVersion ( )
return
}
2013-11-26 17:50:43 +00:00
if flHosts . Len ( ) == 0 {
2013-12-21 00:30:41 +00:00
defaultHost := os . Getenv ( "DOCKER_HOST" )
if defaultHost == "" || * flDaemon {
// If we do not have a host, default to unix socket
2014-01-29 19:26:54 +00:00
defaultHost = fmt . Sprintf ( "unix://%s" , api . DEFAULTUNIXSOCKET )
2013-12-21 00:30:41 +00:00
}
flHosts . Set ( defaultHost )
2013-06-19 12:31:54 +00:00
}
2013-12-13 15:47:19 +00:00
if * bridgeName != "" && * bridgeIp != "" {
2013-12-23 19:43:54 +00:00
log . Fatal ( "You specified -b & --bip, mutually exclusive options. Please specify only one." )
2013-12-13 15:47:19 +00:00
}
2013-04-02 17:58:16 +00:00
if * flDebug {
os . Setenv ( "DEBUG" , "1" )
}
2013-06-04 18:00:22 +00:00
docker . GITCOMMIT = GITCOMMIT
2013-08-07 03:49:55 +00:00
docker . VERSION = VERSION
2013-03-29 00:12:23 +00:00
if * flDaemon {
2013-03-13 07:29:40 +00:00
if flag . NArg ( ) != 0 {
flag . Usage ( )
return
}
2013-12-18 18:15:09 +00:00
2013-10-23 08:09:16 +00:00
eng , err := engine . New ( * flRoot )
2013-10-21 16:04:42 +00:00
if err != nil {
log . Fatal ( err )
2013-10-05 02:25:15 +00:00
}
2013-10-27 00:19:35 +00:00
// Load plugin: httpapi
2014-01-31 19:30:43 +00:00
job := eng . Job ( "initserver" )
2013-10-21 16:04:42 +00:00
job . Setenv ( "Pidfile" , * pidfile )
2013-10-23 08:09:16 +00:00
job . Setenv ( "Root" , * flRoot )
2013-10-21 16:04:42 +00:00
job . SetenvBool ( "AutoRestart" , * flAutoRestart )
2013-11-22 17:55:27 +00:00
job . SetenvList ( "Dns" , flDns . GetAll ( ) )
2013-10-21 16:04:42 +00:00
job . SetenvBool ( "EnableIptables" , * flEnableIptables )
2014-01-28 04:35:05 +00:00
job . SetenvBool ( "EnableIpForward" , * flEnableIpForward )
2013-10-21 16:04:42 +00:00
job . Setenv ( "BridgeIface" , * bridgeName )
2014-01-31 20:18:45 +00:00
job . Setenv ( "BridgeIP" , * bridgeIp )
2013-10-21 16:04:42 +00:00
job . Setenv ( "DefaultIp" , * flDefaultIp )
job . SetenvBool ( "InterContainerCommunication" , * flInterContainerComm )
2013-11-15 07:02:09 +00:00
job . Setenv ( "GraphDriver" , * flGraphDriver )
2013-12-19 23:16:54 +00:00
job . SetenvInt ( "Mtu" , * flMtu )
2013-10-25 06:30:34 +00:00
if err := job . Run ( ) ; err != nil {
2013-03-13 07:29:40 +00:00
log . Fatal ( err )
}
2013-10-27 00:19:35 +00:00
// Serve api
2013-11-26 17:46:06 +00:00
job = eng . Job ( "serveapi" , flHosts . GetAll ( ) ... )
2013-11-05 19:57:40 +00:00
job . SetenvBool ( "Logging" , true )
2014-01-29 00:20:51 +00:00
job . SetenvBool ( "EnableCors" , * flEnableCors )
2014-01-31 19:30:43 +00:00
job . Setenv ( "Version" , VERSION )
2013-10-27 07:06:43 +00:00
if err := job . Run ( ) ; err != nil {
2013-10-27 00:19:35 +00:00
log . Fatal ( err )
}
2013-03-13 07:29:40 +00:00
} else {
2013-11-26 17:46:06 +00:00
if flHosts . Len ( ) > 1 {
2013-06-19 12:31:54 +00:00
log . Fatal ( "Please specify only one -H" )
}
2013-11-26 17:46:06 +00:00
protoAddrParts := strings . SplitN ( flHosts . GetAll ( ) [ 0 ] , "://" , 2 )
2013-06-18 18:59:56 +00:00
if err := docker . ParseCommands ( protoAddrParts [ 0 ] , protoAddrParts [ 1 ] , flag . Args ( ) ... ) ; err != nil {
2013-09-09 21:26:35 +00:00
if sterr , ok := err . ( * utils . StatusError ) ; ok {
2013-10-12 12:14:52 +00:00
if sterr . Status != "" {
log . Println ( sterr . Status )
}
os . Exit ( sterr . StatusCode )
2013-09-09 21:26:35 +00:00
}
2013-03-13 07:29:40 +00:00
log . Fatal ( err )
}
}
}
2013-08-07 03:51:12 +00:00
func showVersion ( ) {
fmt . Printf ( "Docker version %s, build %s\n" , VERSION , GITCOMMIT )
}