diff --git a/config/config.go b/config/config.go index ee6848b5..d6c1365a 100644 --- a/config/config.go +++ b/config/config.go @@ -41,7 +41,6 @@ type Config struct { SystemDockerArgs []string `json:"systemDockerArgs,omitempty"` UserContainers []ContainerConfig `json:"userContainser,omitempty"` UserInit string `json:"userInit,omitempty"` - DockerBin string `json:"dockerBin,omitempty"` Modules []string `json:"modules,omitempty"` Respawn []string `json:"respawn,omitempty"` } @@ -71,17 +70,16 @@ func LoadConfig() (*Config, error) { func NewConfig() *Config { return &Config{ ConsoleContainer: "console", - DockerBin: "/usr/bin/docker", Debug: true, DockerEndpoint: "unix:/var/run/docker.sock", Dns: []string{ "8.8.8.8", "8.8.4.4", }, - ImagesPath: "/", - ImagesPattern: "images*.tar", - StateRequired: false, - //StateDev: "/dev/sda", + ImagesPath: "/", + ImagesPattern: "images*.tar", + StateRequired: false, + StateDev: "/dev/sda", StateDevFSType: "ext4", SysInit: "/sbin/init-sys", SystemDockerArgs: []string{"docker", "-d", "-s", "overlay", "-b", "none"}, @@ -122,6 +120,7 @@ func NewConfig() *Config { "--name", "userdocker", "-d", "--restart", "always", + "--pid", "host", "--net", "host", "--privileged", "--volume", "/lib/modules:/lib/modules:ro", @@ -136,16 +135,15 @@ func NewConfig() *Config { "-d", "--rm", "--privileged", - "--volume", "/:/host:ro", + //"--volume", "/:/host:ro", "--volume", "/lib/modules:/lib/modules:ro", "--volume", "/usr/bin/docker:/usr/bin/docker:ro", - "--volume", "/usr/bin/system-docker:/usr/bin/system-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", "--volumes-from", "system-state", "--net", "host", "--pid", "host", - "-it", "console", }, }, @@ -153,15 +151,17 @@ func NewConfig() *Config { RescueContainer: ContainerConfig{ Cmd: []string{ "--name", "rescue", + "-d", "--rm", "--privileged", - "--volume", "/:/host", + //"--volume", "/:/host", "--volume", "/lib/modules:/lib/modules:ro", "--volume", "/usr/bin/docker:/usr/bin/docker:ro", - "--volume", "/var/run/docker.sock:/var/run/docker.sock: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", - "-it", "rescue", }, }, diff --git a/docker/container.go b/docker/container.go index b941b5cc..e8583221 100644 --- a/docker/container.go +++ b/docker/container.go @@ -142,6 +142,10 @@ func (c *Container) Start() *Container { return c.start(false) } +func (c *Container) StartAndWait() *Container { + return c.start(true) +} + func (c *Container) Stage() *Container { c.Parse() diff --git a/init/init.go b/init/init.go index bf8ad055..524a3572 100644 --- a/init/init.go +++ b/init/init.go @@ -5,7 +5,6 @@ import ( "io/ioutil" "os" "os/exec" - "path" "strings" "syscall" "time" @@ -16,23 +15,16 @@ import ( ) const ( - STATE string = "/var" + STATE string = "/var" + DOCKER string = "/usr/bin/docker" ) var ( dirs []string = []string{ - "/bin", - "/dev", - "/dev/pts", "/etc/ssl/certs", - "/proc", "/sbin", - "/sys", "/usr/bin", - "/var/run", - } - statedirs []string = []string{ - "/var/run", + "/var", } mounts [][]string = [][]string{ []string{"none", "/etc/docker", "tmpfs", ""}, @@ -41,7 +33,7 @@ var ( []string{"none", "/sys", "sysfs", ""}, []string{"none", "/sys/fs/cgroup", "tmpfs", ""}, []string{"none", "/dev/pts", "devpts", ""}, - []string{"none", "/var/run", "tmpfs", ""}, + []string{"none", "/run", "tmpfs", ""}, } cgroups []string = []string{ "perf_event", @@ -58,17 +50,16 @@ var ( // so map[y] = x symlinks map[string]string = map[string]string{ "/etc/ssl/certs/ca-certificates.crt": "/ca.crt", - "/bin/busybox": "/busybox", "/sbin/init-sys": "/init", "/sbin/init-user": "/init", - "/sbin/modprobe": "/bin/busybox", - "/usr/bin/docker": "/docker", - "/usr/bin/openvt": "/busybox", - "/usr/bin/system-docker": "/init", + "/sbin/modprobe": "/busybox", + "/var/run": "/run", + DOCKER: "/docker", } ) func createSymlinks(cfg *config.Config) error { + log.Debug("Creating symlinking") for dest, src := range symlinks { if _, err := os.Stat(dest); os.IsNotExist(err) { log.Debugf("Symlinking %s => %s", src, dest) @@ -196,7 +187,6 @@ func sysInit(cfg *config.Config) error { cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout } else { - args = append([]string{"openvt", "-s"}, args...) cmd = exec.Command(args[0], args[1:]...) } @@ -209,8 +199,10 @@ func sysInit(cfg *config.Config) error { func execDocker(cfg *config.Config) error { log.Info("Launching Docker") - os.Stdin.Close() - return syscall.Exec(cfg.DockerBin, cfg.SystemDockerArgs, os.Environ()) + //os.Stdin.Close() + //os.Stdout.Close() + //os.Stderr.Close() + return syscall.Exec(DOCKER, cfg.SystemDockerArgs, os.Environ()) } func MainInit() { @@ -225,21 +217,21 @@ func mountState(cfg *config.Config) error { log.Debugf("State will not be persisted") err = util.Mount("none", STATE, "tmpfs", "") } else { - log.Debugf("Mounting state device %s", cfg.StateDev) + log.Debugf("Mounting state device %s to %s", cfg.StateDev, STATE) err = util.Mount(cfg.StateDev, STATE, cfg.StateDevFSType, "") } - if err != nil { - return err - } + //if err != nil { + return err + //} - for _, i := range []string{"docker", "images"} { - dir := path.Join(STATE, i) - err = os.MkdirAll(dir, 0755) - if err != nil { - return err - } - } + //for _, i := range []string{"docker", "images"} { + // dir := path.Join(STATE, i) + // err = os.MkdirAll(dir, 0755) + // if err != nil { + // return err + // } + //} //log.Debugf("Bind mounting %s to %s", path.Join(STATE, "docker"), DOCKER) //err = util.Mount(path.Join(STATE, "docker"), DOCKER, "", "bind") @@ -271,9 +263,7 @@ func RunInit() error { func(cfg *config.Config) error { newCfg, err := config.LoadConfig() if err == nil { - if newCfg.Debug { - newCfg, err = config.LoadConfig() - } + newCfg, err = config.LoadConfig() } if err == nil { *cfg = *newCfg @@ -285,16 +275,13 @@ func RunInit() error { return err }, - createSymlinks, setResolvConf, extractModules, - remountRo, mountCgroups, loadModules, mountState, - func(cfg *config.Config) error { - return createDirs(statedirs...) - }, + createSymlinks, + remountRo, sysInit, } diff --git a/respawn/respawn.go b/respawn/respawn.go index a5d098e0..620a4912 100644 --- a/respawn/respawn.go +++ b/respawn/respawn.go @@ -37,6 +37,7 @@ func execute(line string, wait sync.WaitGroup) { cmd := exec.Command(args[0], args[1:]...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr + cmd.Stdin = os.Stdin err := cmd.Start() if err != nil { diff --git a/scripts/build-common b/scripts/build-common index 06fba0eb..f12f45f0 100644 --- a/scripts/build-common +++ b/scripts/build-common @@ -13,6 +13,15 @@ mkdir -p ${BUILD} ${DIST} busybox_install() { + local conf=$1 + local bbconf=$2 + local target=$3 + + if [ "$#" = "2" ]; then + target=$2 + bbconf= + fi + apt-get update apt-get install -y build-essential wget libncurses5-dev unzip bc @@ -22,11 +31,14 @@ busybox_install() tar xvjf ${ARTIFACTS}/${BUILDROOT} cd ${BUILDROOT/.tar.bz2//} - cp $1 .config + cp $conf .config + if [ -n "$bbconf" ]; then + cp $bbconf package/busybox/ + fi make oldconfig make - cp output/images/rootfs.tar $2 + cp output/images/rootfs.tar $target } write_base() @@ -74,6 +86,10 @@ run() echo -e "\nCOPY $1 /source/$1" >> ${DOCKER_FILE} echo -e "RUN /source/$1" >> ${DOCKER_FILE} fi + + if [ "$RUN_EXEC" = "true" ]; then + $1 + fi } finish() diff --git a/scripts/build-images b/scripts/build-images index ee8084a8..be451bdc 100755 --- a/scripts/build-images +++ b/scripts/build-images @@ -10,7 +10,7 @@ mkdir -p ${BUILD}/initrd ${DIST}/artifacts echo Extracting ${ARTIFACTS}/os-base.tar.xz tar xJf ${ARTIFACTS}/os-base.tar.xz -C ${BUILD} -cp /etc/ssl/certs/ca-certificates.crt ${BUILD}/ca.crt +cp /etc/ssl/certs/ca-certificates.crt ${BUILD}/initrd/ca.crt rm -rf ${BUILD}/initrd/lib cp -rf ${BUILD}/dist/kernel/lib ${BUILD}/initrd diff --git a/scripts/dockerimages/scripts/console.sh b/scripts/dockerimages/scripts/console.sh index 5cad1bd7..eb14e78a 100755 --- a/scripts/dockerimages/scripts/console.sh +++ b/scripts/dockerimages/scripts/console.sh @@ -1,6 +1,9 @@ #!/bin/sh -exec respawn << EOF +#if [ -t 1 ]; then + #exec /bin/sh +#else + exec respawn << EOF /sbin/getty 115200 tty1 /sbin/getty 115200 tty2 /sbin/getty 115200 tty3 @@ -8,3 +11,4 @@ exec respawn << EOF /sbin/getty 115200 tty5 /sbin/getty 115200 tty6 EOF +#fi diff --git a/scripts/download b/scripts/download index 0dc2b331..8fdb609f 100755 --- a/scripts/download +++ b/scripts/download @@ -4,5 +4,5 @@ cd $(dirname $0)/.. source scripts/build-common -download a8e5925eab10a472af4b9326dc3ff1068fd56886 https://github.com/rancherio/os-base/releases/download/v0.0.1/os-base.tar.xz +download 71d4f44964a23418715274729dce30f79f1914c5 https://github.com/rancherio/os-base/releases/download/v0.0.3/os-base.tar.xz download 1acbe869b32869bca5788373e8624a2957cbb380 https://github.com/ibuildthecloud/docker/releases/download/v1.5.0-rancher-2/docker-1.5.0 diff --git a/sysinit/sysinit.go b/sysinit/sysinit.go index 87ac004b..862bb010 100644 --- a/sysinit/sysinit.go +++ b/sysinit/sysinit.go @@ -4,6 +4,7 @@ import ( "os" "os/exec" "path" + "syscall" log "github.com/Sirupsen/logrus" dockerClient "github.com/fsouza/go-dockerclient" @@ -121,16 +122,28 @@ func runContainers(cfg *config.Config) error { } for _, containerConfig := range containerConfigs { + container := docker.NewContainer(cfg, &containerConfig) + container.Parse() + if util.Contains(cfg.Disable, containerConfig.Id) { - log.Debugf("%s is disabled", containerConfig.Id) + log.Debugf("%s is disabled : %v", containerConfig.Id, cfg.Disable) continue } - err := docker.StartAndWait(cfg, &containerConfig) + if containerConfig.Id == cfg.ConsoleContainer { + if util.IsRunningInTty() { + container.Config.Tty = true + container.Config.AttachStdin = true + container.Config.AttachStdout = true + container.Config.AttachStderr = true + } + } + + container.StartAndWait() log.Debugf("Running %s", containerConfig.Id) - if err != nil { - log.Errorf("Failed to run %v: %v", containerConfig.Id, err) + if container.Err != nil { + log.Errorf("Failed to run %v: %v", containerConfig.Id, container.Err) } } @@ -138,7 +151,11 @@ func runContainers(cfg *config.Config) error { } func launchConsole(cfg *config.Config) error { + if !util.IsRunningInTty() { + return nil + } + log.Debugf("Attaching to console") cmd := exec.Command("docker", "attach", "console") cmd.Stdout = os.Stdout cmd.Stdin = os.Stdin @@ -170,6 +187,10 @@ func sysInit() error { initFuncs := []config.InitFunc{ loadImages, runContainers, + func(cfg *config.Config) error { + syscall.Sync() + return nil + }, //launchConsole, } diff --git a/util/term.go b/util/term.go index 9a353448..c0ef38e8 100644 --- a/util/term.go +++ b/util/term.go @@ -1,14 +1,7 @@ package util -import ( - "github.com/kless/term" - - log "github.com/Sirupsen/logrus" -) +import "github.com/kless/term" func IsRunningInTty() bool { - log.Infof("Is a tty : %v", term.IsTerminal(0)) - log.Infof("Is a tty : %v", term.IsTerminal(1)) - log.Infof("Is a tty : %v", term.IsTerminal(2)) return term.IsTerminal(1) } diff --git a/util/util.go b/util/util.go index 0bfec733..7ff379be 100644 --- a/util/util.go +++ b/util/util.go @@ -105,8 +105,8 @@ func Contains(values []string, value string) bool { return false } - for _, value := range values { - if value == value { + for _, i := range values { + if i == value { return true } }