1
0
mirror of https://github.com/rancher/os.git synced 2025-07-30 22:24:33 +00:00

Add tty and half way broken state handling

This commit is contained in:
Darren Shepherd 2015-02-16 16:38:49 -07:00
parent 3ab1f76ef0
commit 925a847ccc
11 changed files with 96 additions and 70 deletions

View File

@ -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",
},
},

View File

@ -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()

View File

@ -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,
}

View File

@ -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 {

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,
}

View File

@ -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)
}

View File

@ -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
}
}