package main import ( "fmt" "github.com/dotcloud/docker/engine" "github.com/dotcloud/docker/engine/spawn" "log" "os" "os/exec" "strings" ) func main() { fmt.Printf("[%d] MAIN\n", os.Getpid()) spawn.Init(&Worker{}) fmt.Printf("[%d parent] spawning\n", os.Getpid()) eng, err := spawn.Spawn() if err != nil { log.Fatal(err) } fmt.Printf("[parent] spawned\n") job := eng.Job(os.Args[1], os.Args[2:]...) job.Stdout.Add(os.Stdout) job.Stderr.Add(os.Stderr) job.Run() // FIXME: use the job's status code os.Exit(0) } type Worker struct { } func (w *Worker) Install(eng *engine.Engine) error { eng.Register("exec", w.Exec) eng.Register("cd", w.Cd) eng.Register("echo", w.Echo) return nil } func (w *Worker) Exec(job *engine.Job) engine.Status { fmt.Printf("--> %v\n", job.Args) cmd := exec.Command(job.Args[0], job.Args[1:]...) cmd.Stdout = job.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { return job.Errorf("%v\n", err) } return engine.StatusOK } func (w *Worker) Cd(job *engine.Job) engine.Status { if err := os.Chdir(job.Args[0]); err != nil { return job.Errorf("%v\n", err) } return engine.StatusOK } func (w *Worker) Echo(job *engine.Job) engine.Status { fmt.Fprintf(job.Stdout, "%s\n", strings.Join(job.Args, " ")) return engine.StatusOK }