1
0
mirror of https://github.com/rancher/os.git synced 2025-09-04 16:21:07 +00:00

Refactor configuration

This commit is contained in:
Darren Shepherd
2015-02-17 14:31:20 -07:00
parent 11a11ca3d1
commit f47ea34ac4
7 changed files with 133 additions and 109 deletions

View File

@@ -1,4 +1,4 @@
package user
package systemdocker
import (
"os"
@@ -6,9 +6,10 @@ import (
"syscall"
log "github.com/Sirupsen/logrus"
"github.com/rancherio/os/config"
)
func SystemDocker() {
func Main() {
var newEnv []string
for _, env := range os.Environ() {
if !strings.HasPrefix(env, "DOCKER_HOST=") {
@@ -16,7 +17,7 @@ func SystemDocker() {
}
}
newEnv = append(newEnv, "DOCKER_HOST=unix:///var/run/system-docker.sock")
newEnv = append(newEnv, "DOCKER_HOST="+config.DOCKER_SYSTEM_HOST)
os.Args[0] = "/usr/bin/docker"
if err := syscall.Exec(os.Args[0], os.Args, newEnv); err != nil {

View File

@@ -1,7 +1,6 @@
package config
import (
"encoding/json"
"io/ioutil"
"os"
"regexp"
@@ -10,9 +9,11 @@ import (
log "github.com/Sirupsen/logrus"
"github.com/rancherio/os/util"
"gopkg.in/yaml.v2"
)
const (
VERSION = "0.0.1"
CONSOLE_CONTAINER = "console"
DOCKER_BIN = "/usr/bin/docker"
DOCKER_SYSTEM_HOST = "unix:///var/run/system-docker.sock"
@@ -22,45 +23,49 @@ const (
SYS_INIT = "/sbin/init-sys"
USER_INIT = "/sbin/init-user"
MODULES_ARCHIVE = "/modules.tar"
DEBUG = true
DEBUG = false
)
type InitFunc func(*Config) error
type ContainerConfig struct {
Id string `json:"id,omitempty"`
Cmd []string `json:"run,omitempty"`
//Config *runconfig.Config `json:"-"`
//HostConfig *runconfig.HostConfig `json:"-"`
Id string `yaml:"id,omitempty"`
Cmd string `yaml:"run,omitempty"`
//Config *runconfig.Config `yaml:"-"`
//HostConfig *runconfig.HostConfig `yaml:"-"`
}
type Config struct {
//BootstrapContainers []ContainerConfig `json:"bootstrapContainers,omitempty"`
//UserContainers []ContainerConfig `json:"userContainser,omitempty"`
ConsoleContainer string `json:"consoleContainer,omitempty"`
Debug bool `json:"debug,omitempty"`
Disable []string `json:"disable,omitempty"`
Dns []string `json:"dns,omitempty"`
Rescue bool `json:"rescue,omitempty"`
RescueContainer ContainerConfig `json:"rescueContainer,omitempty"`
State ConfigState `json:"state,omitempty"`
SystemContainers []ContainerConfig `json:"systemContainers,omitempty"`
SystemDockerArgs []string `json:"systemDockerArgs,omitempty"`
Modules []string `json:"modules,omitempty"`
//BootstrapContainers []ContainerConfig `yaml:"bootstrapContainers,omitempty"`
//UserContainers []ContainerConfig `yaml:"userContainser,omitempty"`
Debug bool `yaml:"debug,omitempty"`
Disable []string `yaml:"disable,omitempty"`
Dns []string `yaml:"dns,omitempty"`
Rescue bool `yaml:"rescue,omitempty"`
RescueContainer *ContainerConfig `yaml:"rescue_container,omitempty"`
State ConfigState `yaml:"state,omitempty"`
SystemContainers []ContainerConfig `yaml:"system_containers,omitempty"`
SystemDockerArgs []string `yaml:"system_docker_args,flow,omitempty"`
Modules []string `yaml:"modules,omitempty"`
}
type ConfigState struct {
FsType string `json:"fsType,omitempty"`
Dev string `json:"dev,omitempty"`
Required bool `json:"required,omitempty"`
FsType string `yaml:"fstype"`
Dev string `yaml:"dev"`
Required bool `yaml:"required"`
}
func (c *Config) Dump() string {
content, err := json.MarshalIndent(c, "", " ")
if err == nil {
return string(content)
func (c *Config) ClearReadOnly() {
c.SystemContainers = []ContainerConfig{}
c.RescueContainer = nil
}
func (c *Config) Dump() (string, error) {
content, err := yaml.Marshal(c)
if err != nil {
return "", err
} else {
return err.Error()
return string(content), err
}
}
@@ -93,11 +98,11 @@ func (c *Config) readArgs() error {
func (c *Config) merge(values map[string]interface{}) error {
// Lazy way to assign values to *Config
override, err := json.Marshal(values)
override, err := yaml.Marshal(values)
if err != nil {
return err
}
return json.Unmarshal(override, c)
return yaml.Unmarshal(override, c)
}
func (c *Config) readCmdline() error {

View File

@@ -16,83 +16,71 @@ func NewConfig() *Config {
Modules: []string{},
SystemContainers: []ContainerConfig{
{
Cmd: []string{
"--name", "system-state",
"--net", "none",
"--read-only",
Cmd: "--name=system-state " +
"--net=none " +
"--read-only " +
"state",
},
},
{
Cmd: []string{
"--name", "udev",
"--net", "none",
"--privileged",
"--rm",
"--volume", "/dev:/host/dev",
"--volume", "/lib/modules:/lib/modules:ro",
Cmd: "--name=udev " +
"--net=none " +
"--privileged " +
"--rm " +
"-v=/dev:/host/dev " +
"-v=/lib/modules:/lib/modules:ro " +
"udev",
},
},
{
Cmd: []string{
"--name", "network",
"--cap-add", "NET_ADMIN",
"--net", "host",
"--rm",
Cmd: "--name=network " +
"--cap-add=NET_ADMIN " +
"--net=host " +
"--rm " +
"network",
},
},
{
Cmd: []string{
"--name", "userdocker",
"-d",
"--restart", "always",
"--pid", "host",
"--net", "host",
"--privileged",
"--volume", "/lib/modules:/lib/modules:ro",
"--volume", "/usr/bin/docker:/usr/bin/docker:ro",
"--volumes-from", "system-state",
Cmd: "--name=userdocker " +
"-d " +
"--restart=always " +
"--pid=host " +
"--net=host " +
"--privileged " +
"-v=/lib/modules:/lib/modules:ro " +
"-v=/usr/bin/docker:/usr/bin/docker:ro " +
"--volumes-from=system-state " +
"userdocker",
},
},
{
Cmd: []string{
"--name", "console",
"-d",
"--rm",
"--privileged",
"--volume", "/lib/modules:/lib/modules:ro",
"--volume", "/usr/bin/docker:/usr/bin/docker:ro",
"--volume", "/init:/usr/bin/system-docker:ro",
"--volume", "/init:/usr/bin/respawn:ro",
"--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro",
"--volume", "/init:/sbin/poweroff:ro",
"--volume", "/init:/sbin/reboot:ro",
"--volume", "/init:/sbin/halt:ro",
"--volumes-from", "system-state",
"--net", "host",
"--pid", "host",
Cmd: "--name=console " +
"-d " +
"--rm " +
"--privileged " +
"-v=/lib/modules:/lib/modules:ro " +
"-v=/usr/bin/docker:/usr/bin/docker:ro " +
"-v=/init:/usr/bin/system-docker:ro " +
"-v=/init:/usr/bin/respawn:ro " +
"-v=/var/run/docker.sock:/var/run/system-docker.sock:ro " +
"-v=/init:/sbin/poweroff:ro " +
"-v=/init:/sbin/reboot:ro " +
"-v=/init:/sbin/halt:ro " +
"--volumes-from=system-state " +
"--net=host " +
"--pid=host " +
"console",
},
},
},
RescueContainer: ContainerConfig{
Cmd: []string{
"--name", "rescue",
"-d",
"--rm",
"--privileged",
"--volume", "/lib/modules:/lib/modules:ro",
"--volume", "/usr/bin/docker:/usr/bin/docker:ro",
"--volume", "/init:/usr/bin/system-docker:ro",
"--volume", "/init:/usr/bin/respawn:ro",
"--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro",
"--net", "host",
"--pid", "host",
RescueContainer: &ContainerConfig{
Cmd: "--name=rescue " +
"-d " +
"--rm " +
"--privileged " +
"-v=/lib/modules:/lib/modules:ro " +
"-v=/usr/bin/docker:/usr/bin/docker:ro " +
"-v=/init:/usr/bin/system-docker:ro " +
"-v=/init:/usr/bin/respawn:ro " +
"-v=/var/run/docker.sock:/var/run/system-docker.sock:ro " +
"--net=host " +
"--pid=host " +
"rescue",
},
},
}
}

View File

@@ -9,8 +9,10 @@ import (
"os"
"strings"
log "github.com/Sirupsen/logrus"
flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/runconfig"
shlex "github.com/flynn/go-shlex"
dockerClient "github.com/fsouza/go-dockerclient"
"github.com/rancherio/os/config"
"github.com/rancherio/os/util"
@@ -38,7 +40,7 @@ func getHash(containerCfg *config.ContainerConfig) (string, error) {
w := util.NewErrorWriter(hash)
w.Write([]byte(containerCfg.Id))
w.Write([]byte(strings.Join(containerCfg.Cmd, ":")))
w.Write([]byte(containerCfg.Cmd))
if w.Err != nil {
return "", w.Err
@@ -126,13 +128,19 @@ func (c *Container) Parse() *Container {
flDetach := flags.Bool([]string{"d", "-detach"}, false, "")
flName := flags.String([]string{"#name", "-name"}, "", "")
c.Config, c.HostConfig, _, c.Err = runconfig.Parse(flags, c.containerCfg.Cmd)
args, err := shlex.Split(c.containerCfg.Cmd)
if err != nil {
return c.returnErr(err)
}
log.Debugf("Parsing [%s]", strings.Join(args, ","))
c.Config, c.HostConfig, _, c.Err = runconfig.Parse(flags, args)
c.Name = *flName
c.detach = *flDetach
c.remove = *flRemove
if len(c.containerCfg.Id) == 0 {
if c.containerCfg.Id == "" {
c.containerCfg.Id = c.Name
}

View File

@@ -263,7 +263,10 @@ func RunInit() error {
}
if cfg.Debug {
log.Debugf("Config: %s", cfg.Dump())
cfgString, _ := cfg.Dump()
if cfgString != "" {
log.Debugf("Config: %s", cfgString)
}
}
return err

41
main.go
View File

@@ -2,27 +2,46 @@ package main
import (
"os"
"strings"
log "github.com/Sirupsen/logrus"
"github.com/docker/docker/pkg/reexec"
"github.com/rancherio/os/cmd/control"
"github.com/rancherio/os/cmd/systemdocker"
osInit "github.com/rancherio/os/init"
"github.com/rancherio/os/power"
"github.com/rancherio/os/respawn"
"github.com/rancherio/os/sysinit"
"github.com/rancherio/os/user"
)
func registerCmd(cmd string, mainFunc func()) {
log.Debugf("Registering main %s", cmd)
reexec.Register(cmd, mainFunc)
parts := strings.Split(cmd, "/")
if len(parts) == 0 {
return
}
last := parts[len(parts)-1]
log.Debugf("Registering main %s", last)
reexec.Register(last, mainFunc)
log.Debugf("Registering main %s", "./"+last)
reexec.Register("./"+last, mainFunc)
}
func main() {
reexec.Register("init", osInit.MainInit)
reexec.Register("/init", osInit.MainInit)
reexec.Register("./init", osInit.MainInit)
reexec.Register("/sbin/init-sys", sysinit.SysInit)
reexec.Register("/usr/bin/system-docker", user.SystemDocker)
reexec.Register("system-docker", user.SystemDocker)
reexec.Register("poweroff", power.PowerOff)
reexec.Register("reboot", power.Reboot)
reexec.Register("halt", power.Halt)
reexec.Register("respawn", respawn.Main)
registerCmd("/init", osInit.MainInit)
registerCmd("/sbin/init-sys", sysinit.SysInit)
registerCmd("/usr/bin/system-docker", systemdocker.Main)
registerCmd("/sbin/poweroff", power.PowerOff)
registerCmd("/sbin/reboot", power.Reboot)
registerCmd("/sbin/halt", power.Halt)
registerCmd("/usr/bin/respawn", respawn.Main)
registerCmd("/usr/sbin/rancherctl", control.Main)
if !reexec.Init() {
log.Fatalf("Failed to find an entry point for %s", os.Args[0])
}

View File

@@ -118,7 +118,7 @@ func runContainers(cfg *config.Config) error {
containerConfigs := cfg.SystemContainers
if cfg.Rescue {
log.Debug("Running rescue container")
containerConfigs = []config.ContainerConfig{cfg.RescueContainer}
containerConfigs = []config.ContainerConfig{*cfg.RescueContainer}
}
for _, containerConfig := range containerConfigs {
@@ -130,7 +130,7 @@ func runContainers(cfg *config.Config) error {
continue
}
if containerConfig.Id == cfg.ConsoleContainer {
if containerConfig.Id == config.CONSOLE_CONTAINER {
if util.IsRunningInTty() {
container.Config.Tty = true
container.Config.AttachStdin = true