mirror of
https://github.com/rancher/os.git
synced 2025-09-03 15:54:24 +00:00
Refactor configuration
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
package user
|
package systemdocker
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
@@ -6,9 +6,10 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
|
"github.com/rancherio/os/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func SystemDocker() {
|
func Main() {
|
||||||
var newEnv []string
|
var newEnv []string
|
||||||
for _, env := range os.Environ() {
|
for _, env := range os.Environ() {
|
||||||
if !strings.HasPrefix(env, "DOCKER_HOST=") {
|
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"
|
os.Args[0] = "/usr/bin/docker"
|
||||||
if err := syscall.Exec(os.Args[0], os.Args, newEnv); err != nil {
|
if err := syscall.Exec(os.Args[0], os.Args, newEnv); err != nil {
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
@@ -10,9 +9,11 @@ import (
|
|||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
"github.com/rancherio/os/util"
|
"github.com/rancherio/os/util"
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
VERSION = "0.0.1"
|
||||||
CONSOLE_CONTAINER = "console"
|
CONSOLE_CONTAINER = "console"
|
||||||
DOCKER_BIN = "/usr/bin/docker"
|
DOCKER_BIN = "/usr/bin/docker"
|
||||||
DOCKER_SYSTEM_HOST = "unix:///var/run/system-docker.sock"
|
DOCKER_SYSTEM_HOST = "unix:///var/run/system-docker.sock"
|
||||||
@@ -22,45 +23,49 @@ const (
|
|||||||
SYS_INIT = "/sbin/init-sys"
|
SYS_INIT = "/sbin/init-sys"
|
||||||
USER_INIT = "/sbin/init-user"
|
USER_INIT = "/sbin/init-user"
|
||||||
MODULES_ARCHIVE = "/modules.tar"
|
MODULES_ARCHIVE = "/modules.tar"
|
||||||
DEBUG = true
|
DEBUG = false
|
||||||
)
|
)
|
||||||
|
|
||||||
type InitFunc func(*Config) error
|
type InitFunc func(*Config) error
|
||||||
|
|
||||||
type ContainerConfig struct {
|
type ContainerConfig struct {
|
||||||
Id string `json:"id,omitempty"`
|
Id string `yaml:"id,omitempty"`
|
||||||
Cmd []string `json:"run,omitempty"`
|
Cmd string `yaml:"run,omitempty"`
|
||||||
//Config *runconfig.Config `json:"-"`
|
//Config *runconfig.Config `yaml:"-"`
|
||||||
//HostConfig *runconfig.HostConfig `json:"-"`
|
//HostConfig *runconfig.HostConfig `yaml:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
//BootstrapContainers []ContainerConfig `json:"bootstrapContainers,omitempty"`
|
//BootstrapContainers []ContainerConfig `yaml:"bootstrapContainers,omitempty"`
|
||||||
//UserContainers []ContainerConfig `json:"userContainser,omitempty"`
|
//UserContainers []ContainerConfig `yaml:"userContainser,omitempty"`
|
||||||
ConsoleContainer string `json:"consoleContainer,omitempty"`
|
Debug bool `yaml:"debug,omitempty"`
|
||||||
Debug bool `json:"debug,omitempty"`
|
Disable []string `yaml:"disable,omitempty"`
|
||||||
Disable []string `json:"disable,omitempty"`
|
Dns []string `yaml:"dns,omitempty"`
|
||||||
Dns []string `json:"dns,omitempty"`
|
Rescue bool `yaml:"rescue,omitempty"`
|
||||||
Rescue bool `json:"rescue,omitempty"`
|
RescueContainer *ContainerConfig `yaml:"rescue_container,omitempty"`
|
||||||
RescueContainer ContainerConfig `json:"rescueContainer,omitempty"`
|
State ConfigState `yaml:"state,omitempty"`
|
||||||
State ConfigState `json:"state,omitempty"`
|
SystemContainers []ContainerConfig `yaml:"system_containers,omitempty"`
|
||||||
SystemContainers []ContainerConfig `json:"systemContainers,omitempty"`
|
SystemDockerArgs []string `yaml:"system_docker_args,flow,omitempty"`
|
||||||
SystemDockerArgs []string `json:"systemDockerArgs,omitempty"`
|
Modules []string `yaml:"modules,omitempty"`
|
||||||
Modules []string `json:"modules,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigState struct {
|
type ConfigState struct {
|
||||||
FsType string `json:"fsType,omitempty"`
|
FsType string `yaml:"fstype"`
|
||||||
Dev string `json:"dev,omitempty"`
|
Dev string `yaml:"dev"`
|
||||||
Required bool `json:"required,omitempty"`
|
Required bool `yaml:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) Dump() string {
|
func (c *Config) ClearReadOnly() {
|
||||||
content, err := json.MarshalIndent(c, "", " ")
|
c.SystemContainers = []ContainerConfig{}
|
||||||
if err == nil {
|
c.RescueContainer = nil
|
||||||
return string(content)
|
}
|
||||||
|
|
||||||
|
func (c *Config) Dump() (string, error) {
|
||||||
|
content, err := yaml.Marshal(c)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
} else {
|
} 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 {
|
func (c *Config) merge(values map[string]interface{}) error {
|
||||||
// Lazy way to assign values to *Config
|
// Lazy way to assign values to *Config
|
||||||
override, err := json.Marshal(values)
|
override, err := yaml.Marshal(values)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return json.Unmarshal(override, c)
|
return yaml.Unmarshal(override, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) readCmdline() error {
|
func (c *Config) readCmdline() error {
|
||||||
|
@@ -16,83 +16,71 @@ func NewConfig() *Config {
|
|||||||
Modules: []string{},
|
Modules: []string{},
|
||||||
SystemContainers: []ContainerConfig{
|
SystemContainers: []ContainerConfig{
|
||||||
{
|
{
|
||||||
Cmd: []string{
|
Cmd: "--name=system-state " +
|
||||||
"--name", "system-state",
|
"--net=none " +
|
||||||
"--net", "none",
|
"--read-only " +
|
||||||
"--read-only",
|
|
||||||
"state",
|
"state",
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Cmd: []string{
|
Cmd: "--name=udev " +
|
||||||
"--name", "udev",
|
"--net=none " +
|
||||||
"--net", "none",
|
"--privileged " +
|
||||||
"--privileged",
|
"--rm " +
|
||||||
"--rm",
|
"-v=/dev:/host/dev " +
|
||||||
"--volume", "/dev:/host/dev",
|
"-v=/lib/modules:/lib/modules:ro " +
|
||||||
"--volume", "/lib/modules:/lib/modules:ro",
|
|
||||||
"udev",
|
"udev",
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Cmd: []string{
|
Cmd: "--name=network " +
|
||||||
"--name", "network",
|
"--cap-add=NET_ADMIN " +
|
||||||
"--cap-add", "NET_ADMIN",
|
"--net=host " +
|
||||||
"--net", "host",
|
"--rm " +
|
||||||
"--rm",
|
|
||||||
"network",
|
"network",
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Cmd: []string{
|
Cmd: "--name=userdocker " +
|
||||||
"--name", "userdocker",
|
"-d " +
|
||||||
"-d",
|
"--restart=always " +
|
||||||
"--restart", "always",
|
"--pid=host " +
|
||||||
"--pid", "host",
|
"--net=host " +
|
||||||
"--net", "host",
|
"--privileged " +
|
||||||
"--privileged",
|
"-v=/lib/modules:/lib/modules:ro " +
|
||||||
"--volume", "/lib/modules:/lib/modules:ro",
|
"-v=/usr/bin/docker:/usr/bin/docker:ro " +
|
||||||
"--volume", "/usr/bin/docker:/usr/bin/docker:ro",
|
"--volumes-from=system-state " +
|
||||||
"--volumes-from", "system-state",
|
|
||||||
"userdocker",
|
"userdocker",
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Cmd: []string{
|
Cmd: "--name=console " +
|
||||||
"--name", "console",
|
"-d " +
|
||||||
"-d",
|
"--rm " +
|
||||||
"--rm",
|
"--privileged " +
|
||||||
"--privileged",
|
"-v=/lib/modules:/lib/modules:ro " +
|
||||||
"--volume", "/lib/modules:/lib/modules:ro",
|
"-v=/usr/bin/docker:/usr/bin/docker:ro " +
|
||||||
"--volume", "/usr/bin/docker:/usr/bin/docker:ro",
|
"-v=/init:/usr/bin/system-docker:ro " +
|
||||||
"--volume", "/init:/usr/bin/system-docker:ro",
|
"-v=/init:/usr/bin/respawn:ro " +
|
||||||
"--volume", "/init:/usr/bin/respawn:ro",
|
"-v=/var/run/docker.sock:/var/run/system-docker.sock:ro " +
|
||||||
"--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro",
|
"-v=/init:/sbin/poweroff:ro " +
|
||||||
"--volume", "/init:/sbin/poweroff:ro",
|
"-v=/init:/sbin/reboot:ro " +
|
||||||
"--volume", "/init:/sbin/reboot:ro",
|
"-v=/init:/sbin/halt:ro " +
|
||||||
"--volume", "/init:/sbin/halt:ro",
|
"--volumes-from=system-state " +
|
||||||
"--volumes-from", "system-state",
|
"--net=host " +
|
||||||
"--net", "host",
|
"--pid=host " +
|
||||||
"--pid", "host",
|
|
||||||
"console",
|
"console",
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
RescueContainer: ContainerConfig{
|
RescueContainer: &ContainerConfig{
|
||||||
Cmd: []string{
|
Cmd: "--name=rescue " +
|
||||||
"--name", "rescue",
|
"-d " +
|
||||||
"-d",
|
"--rm " +
|
||||||
"--rm",
|
"--privileged " +
|
||||||
"--privileged",
|
"-v=/lib/modules:/lib/modules:ro " +
|
||||||
"--volume", "/lib/modules:/lib/modules:ro",
|
"-v=/usr/bin/docker:/usr/bin/docker:ro " +
|
||||||
"--volume", "/usr/bin/docker:/usr/bin/docker:ro",
|
"-v=/init:/usr/bin/system-docker:ro " +
|
||||||
"--volume", "/init:/usr/bin/system-docker:ro",
|
"-v=/init:/usr/bin/respawn:ro " +
|
||||||
"--volume", "/init:/usr/bin/respawn:ro",
|
"-v=/var/run/docker.sock:/var/run/system-docker.sock:ro " +
|
||||||
"--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro",
|
"--net=host " +
|
||||||
"--net", "host",
|
"--pid=host " +
|
||||||
"--pid", "host",
|
|
||||||
"rescue",
|
"rescue",
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,8 +9,10 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
flag "github.com/docker/docker/pkg/mflag"
|
flag "github.com/docker/docker/pkg/mflag"
|
||||||
"github.com/docker/docker/runconfig"
|
"github.com/docker/docker/runconfig"
|
||||||
|
shlex "github.com/flynn/go-shlex"
|
||||||
dockerClient "github.com/fsouza/go-dockerclient"
|
dockerClient "github.com/fsouza/go-dockerclient"
|
||||||
"github.com/rancherio/os/config"
|
"github.com/rancherio/os/config"
|
||||||
"github.com/rancherio/os/util"
|
"github.com/rancherio/os/util"
|
||||||
@@ -38,7 +40,7 @@ func getHash(containerCfg *config.ContainerConfig) (string, error) {
|
|||||||
w := util.NewErrorWriter(hash)
|
w := util.NewErrorWriter(hash)
|
||||||
|
|
||||||
w.Write([]byte(containerCfg.Id))
|
w.Write([]byte(containerCfg.Id))
|
||||||
w.Write([]byte(strings.Join(containerCfg.Cmd, ":")))
|
w.Write([]byte(containerCfg.Cmd))
|
||||||
|
|
||||||
if w.Err != nil {
|
if w.Err != nil {
|
||||||
return "", w.Err
|
return "", w.Err
|
||||||
@@ -126,13 +128,19 @@ func (c *Container) Parse() *Container {
|
|||||||
flDetach := flags.Bool([]string{"d", "-detach"}, false, "")
|
flDetach := flags.Bool([]string{"d", "-detach"}, false, "")
|
||||||
flName := flags.String([]string{"#name", "-name"}, "", "")
|
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.Name = *flName
|
||||||
c.detach = *flDetach
|
c.detach = *flDetach
|
||||||
c.remove = *flRemove
|
c.remove = *flRemove
|
||||||
|
|
||||||
if len(c.containerCfg.Id) == 0 {
|
if c.containerCfg.Id == "" {
|
||||||
c.containerCfg.Id = c.Name
|
c.containerCfg.Id = c.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -263,7 +263,10 @@ func RunInit() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Debug {
|
if cfg.Debug {
|
||||||
log.Debugf("Config: %s", cfg.Dump())
|
cfgString, _ := cfg.Dump()
|
||||||
|
if cfgString != "" {
|
||||||
|
log.Debugf("Config: %s", cfgString)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
|
41
main.go
41
main.go
@@ -2,27 +2,46 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
"github.com/docker/docker/pkg/reexec"
|
"github.com/docker/docker/pkg/reexec"
|
||||||
|
"github.com/rancherio/os/cmd/control"
|
||||||
|
"github.com/rancherio/os/cmd/systemdocker"
|
||||||
osInit "github.com/rancherio/os/init"
|
osInit "github.com/rancherio/os/init"
|
||||||
"github.com/rancherio/os/power"
|
"github.com/rancherio/os/power"
|
||||||
"github.com/rancherio/os/respawn"
|
"github.com/rancherio/os/respawn"
|
||||||
"github.com/rancherio/os/sysinit"
|
"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() {
|
func main() {
|
||||||
reexec.Register("init", osInit.MainInit)
|
registerCmd("/init", osInit.MainInit)
|
||||||
reexec.Register("/init", osInit.MainInit)
|
registerCmd("/sbin/init-sys", sysinit.SysInit)
|
||||||
reexec.Register("./init", osInit.MainInit)
|
registerCmd("/usr/bin/system-docker", systemdocker.Main)
|
||||||
reexec.Register("/sbin/init-sys", sysinit.SysInit)
|
registerCmd("/sbin/poweroff", power.PowerOff)
|
||||||
reexec.Register("/usr/bin/system-docker", user.SystemDocker)
|
registerCmd("/sbin/reboot", power.Reboot)
|
||||||
reexec.Register("system-docker", user.SystemDocker)
|
registerCmd("/sbin/halt", power.Halt)
|
||||||
reexec.Register("poweroff", power.PowerOff)
|
registerCmd("/usr/bin/respawn", respawn.Main)
|
||||||
reexec.Register("reboot", power.Reboot)
|
registerCmd("/usr/sbin/rancherctl", control.Main)
|
||||||
reexec.Register("halt", power.Halt)
|
|
||||||
reexec.Register("respawn", respawn.Main)
|
|
||||||
if !reexec.Init() {
|
if !reexec.Init() {
|
||||||
log.Fatalf("Failed to find an entry point for %s", os.Args[0])
|
log.Fatalf("Failed to find an entry point for %s", os.Args[0])
|
||||||
}
|
}
|
||||||
|
@@ -118,7 +118,7 @@ func runContainers(cfg *config.Config) error {
|
|||||||
containerConfigs := cfg.SystemContainers
|
containerConfigs := cfg.SystemContainers
|
||||||
if cfg.Rescue {
|
if cfg.Rescue {
|
||||||
log.Debug("Running rescue container")
|
log.Debug("Running rescue container")
|
||||||
containerConfigs = []config.ContainerConfig{cfg.RescueContainer}
|
containerConfigs = []config.ContainerConfig{*cfg.RescueContainer}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, containerConfig := range containerConfigs {
|
for _, containerConfig := range containerConfigs {
|
||||||
@@ -130,7 +130,7 @@ func runContainers(cfg *config.Config) error {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if containerConfig.Id == cfg.ConsoleContainer {
|
if containerConfig.Id == config.CONSOLE_CONTAINER {
|
||||||
if util.IsRunningInTty() {
|
if util.IsRunningInTty() {
|
||||||
container.Config.Tty = true
|
container.Config.Tty = true
|
||||||
container.Config.AttachStdin = true
|
container.Config.AttachStdin = true
|
||||||
|
Reference in New Issue
Block a user