diff --git a/api.go b/api.go index ba8646599d..4d294667ac 100644 --- a/api.go +++ b/api.go @@ -345,11 +345,11 @@ func postCommit(srv *Server, version float64, w http.ResponseWriter, r *http.Req return err } var ( - config = &Config{} + config engine.Env env engine.Env job = srv.Eng.Job("commit", r.Form.Get("container")) ) - if err := json.NewDecoder(r.Body).Decode(config); err != nil && err != io.EOF { + if err := config.Import(r.Body); err != nil { utils.Errorf("%s", err) } @@ -357,7 +357,7 @@ func postCommit(srv *Server, version float64, w http.ResponseWriter, r *http.Req job.Setenv("tag", r.Form.Get("tag")) job.Setenv("author", r.Form.Get("author")) job.Setenv("comment", r.Form.Get("comment")) - job.SetenvJson("config", config) + job.SetenvSubEnv("config", &config) var id string job.Stdout.AddString(&id) @@ -704,18 +704,14 @@ func postContainersAttach(srv *Server, version float64, w http.ResponseWriter, r return fmt.Errorf("Missing parameter") } - // TODO: replace the buffer by job.AddEnv() var ( job = srv.Eng.Job("inspect", vars["name"], "container") - buffer = bytes.NewBuffer(nil) - c Container + c, err = job.Stdout.AddEnv() ) - job.Stdout.Add(buffer) - if err := job.Run(); err != nil { + if err != nil { return err } - - if err := json.Unmarshal(buffer.Bytes(), &c); err != nil { + if err = job.Run(); err != nil { return err } @@ -742,7 +738,7 @@ func postContainersAttach(srv *Server, version float64, w http.ResponseWriter, r fmt.Fprintf(outStream, "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.docker.raw-stream\r\n\r\n") - if !c.Config.Tty && version >= 1.6 { + if c.GetSubEnv("Config") != nil && !c.GetSubEnv("Config").GetBool("Tty") && version >= 1.6 { errStream = utils.NewStdWriter(outStream, utils.Stderr) outStream = utils.NewStdWriter(outStream, utils.Stdout) } else { diff --git a/engine/env.go b/engine/env.go index f93555a40b..f30e135555 100644 --- a/engine/env.go +++ b/engine/env.go @@ -86,6 +86,28 @@ func (env *Env) GetList(key string) []string { return l } +func (env *Env) GetSubEnv(key string) *Env { + sval := env.Get(key) + if sval == "" { + return nil + } + buf := bytes.NewBufferString(sval) + var sub Env + if err := sub.Decode(buf); err != nil { + return nil + } + return &sub +} + +func (env *Env) SetSubEnv(key string, sub *Env) error { + var buf bytes.Buffer + if err := sub.Encode(&buf); err != nil { + return err + } + env.Set(key, string(buf.Bytes())) + return nil +} + func (env *Env) GetJson(key string, iface interface{}) error { sval := env.Get(key) if sval == "" { diff --git a/engine/job.go b/engine/job.go index 34393fcab5..5447441beb 100644 --- a/engine/job.go +++ b/engine/job.go @@ -114,6 +114,14 @@ func (job *Job) SetenvBool(key string, value bool) { job.env.SetBool(key, value) } +func (job *Job) GetenvSubEnv(key string) *Env { + return job.env.GetSubEnv(key) +} + +func (job *Job) SetenvSubEnv(key string, value *Env) error { + return job.env.SetSubEnv(key, value) +} + func (job *Job) GetenvInt64(key string) int64 { return job.env.GetInt64(key) } diff --git a/server.go b/server.go index a6f869f977..2df7a8abc6 100644 --- a/server.go +++ b/server.go @@ -1660,8 +1660,7 @@ func (srv *Server) ContainerCreate(job *engine.Job) engine.Status { } resolvConf, err := utils.GetResolvConf() if err != nil { - job.Error(err) - return engine.StatusErr + return job.Error(err) } if !config.NetworkDisabled && len(config.Dns) == 0 && len(srv.runtime.config.Dns) == 0 && utils.CheckLocalDns(resolvConf) { job.Errorf("WARNING: Docker detected local DNS server on resolv.conf. Using default external servers: %v\n", defaultDns)