diff --git a/components/engine/api/server/server.go b/components/engine/api/server/server.go index 91307a1990..2cc9662496 100644 --- a/components/engine/api/server/server.go +++ b/components/engine/api/server/server.go @@ -809,30 +809,23 @@ func postContainersCreate(eng *engine.Engine, version version.Version, w http.Re return err } var ( - job = eng.Job("create", r.Form.Get("name")) - outWarnings []string - stdoutBuffer = bytes.NewBuffer(nil) - warnings = bytes.NewBuffer(nil) + warnings []string + name = r.Form.Get("name") + env = new(engine.Env) ) - if err := job.DecodeEnv(r.Body); err != nil { + if err := env.Decode(r.Body); err != nil { return err } - // Read container ID from the first line of stdout - job.Stdout.Add(stdoutBuffer) - // Read warnings from stderr - job.Stderr.Add(warnings) - if err := job.Run(); err != nil { + + containerId, warnings, err := getDaemon(eng).ContainerCreate(name, env) + if err != nil { return err } - // Parse warnings from stderr - scanner := bufio.NewScanner(warnings) - for scanner.Scan() { - outWarnings = append(outWarnings, scanner.Text()) - } + return writeJSON(w, http.StatusCreated, &types.ContainerCreateResponse{ - ID: engine.Tail(stdoutBuffer, 1), - Warnings: outWarnings, + ID: containerId, + Warnings: warnings, }) } diff --git a/components/engine/daemon/create.go b/components/engine/daemon/create.go index 02ef7e0a17..da271043f2 100644 --- a/components/engine/daemon/create.go +++ b/components/engine/daemon/create.go @@ -12,36 +12,31 @@ import ( "github.com/docker/libcontainer/label" ) -func (daemon *Daemon) ContainerCreate(job *engine.Job) error { - var name string - if len(job.Args) == 1 { - name = job.Args[0] - } else if len(job.Args) > 1 { - return fmt.Errorf("Usage: %s", job.Name) - } +func (daemon *Daemon) ContainerCreate(name string, env *engine.Env) (string, []string, error) { + var warnings []string - config := runconfig.ContainerConfigFromJob(job) - hostConfig := runconfig.ContainerHostConfigFromJob(job.env) + config := runconfig.ContainerConfigFromJob(env) + hostConfig := runconfig.ContainerHostConfigFromJob(env) if len(hostConfig.LxcConf) > 0 && !strings.Contains(daemon.ExecutionDriver().Name(), "lxc") { - return fmt.Errorf("Cannot use --lxc-conf with execdriver: %s", daemon.ExecutionDriver().Name()) + return "", warnings, fmt.Errorf("Cannot use --lxc-conf with execdriver: %s", daemon.ExecutionDriver().Name()) } if hostConfig.Memory != 0 && hostConfig.Memory < 4194304 { - return fmt.Errorf("Minimum memory limit allowed is 4MB") + return "", warnings, fmt.Errorf("Minimum memory limit allowed is 4MB") } if hostConfig.Memory > 0 && !daemon.SystemConfig().MemoryLimit { - job.Errorf("Your kernel does not support memory limit capabilities. Limitation discarded.\n") + warnings = append(warnings, "Your kernel does not support memory limit capabilities. Limitation discarded.\n") hostConfig.Memory = 0 } if hostConfig.Memory > 0 && hostConfig.MemorySwap != -1 && !daemon.SystemConfig().SwapLimit { - job.Errorf("Your kernel does not support swap limit capabilities. Limitation discarded.\n") + warnings = append(warnings, "Your kernel does not support swap limit capabilities. Limitation discarded.\n") hostConfig.MemorySwap = -1 } if hostConfig.Memory > 0 && hostConfig.MemorySwap > 0 && hostConfig.MemorySwap < hostConfig.Memory { - return fmt.Errorf("Minimum memoryswap limit should be larger than memory limit, see usage.\n") + return "", warnings, fmt.Errorf("Minimum memoryswap limit should be larger than memory limit, see usage.\n") } if hostConfig.Memory == 0 && hostConfig.MemorySwap > 0 { - return fmt.Errorf("You should always set the Memory limit when using Memoryswap limit, see usage.\n") + return "", warnings, fmt.Errorf("You should always set the Memory limit when using Memoryswap limit, see usage.\n") } container, buildWarnings, err := daemon.Create(config, hostConfig, name) @@ -51,22 +46,18 @@ func (daemon *Daemon) ContainerCreate(job *engine.Job) error { if tag == "" { tag = graph.DEFAULTTAG } - return fmt.Errorf("No such image: %s (tag: %s)", config.Image, tag) + return "", warnings, fmt.Errorf("No such image: %s (tag: %s)", config.Image, tag) } - return err + return "", warnings, err } if !container.Config.NetworkDisabled && daemon.SystemConfig().IPv4ForwardingDisabled { - job.Errorf("IPv4 forwarding is disabled.\n") + warnings = append(warnings, "IPv4 forwarding is disabled.\n") } + container.LogEvent("create") + warnings = append(warnings, buildWarnings...) - job.Printf("%s\n", container.ID) - - for _, warning := range buildWarnings { - job.Errorf("%s\n", warning) - } - - return nil + return container.ID, warnings, nil } // Create creates a new container from the given configuration with a given name. diff --git a/components/engine/daemon/daemon.go b/components/engine/daemon/daemon.go index d5d420f107..76ed5a5ddc 100644 --- a/components/engine/daemon/daemon.go +++ b/components/engine/daemon/daemon.go @@ -119,7 +119,8 @@ type Daemon struct { func (daemon *Daemon) Install(eng *engine.Engine) error { for name, method := range map[string]engine.Handler{ "container_inspect": daemon.ContainerInspect, - "create": daemon.ContainerCreate, + "container_stats": daemon.ContainerStats, + "export": daemon.ContainerExport, "info": daemon.CmdInfo, "restart": daemon.ContainerRestart, "stop": daemon.ContainerStop, diff --git a/components/engine/runconfig/config.go b/components/engine/runconfig/config.go index 45255e9b01..30dd1eb4cf 100644 --- a/components/engine/runconfig/config.go +++ b/components/engine/runconfig/config.go @@ -36,41 +36,41 @@ type Config struct { Labels map[string]string } -func ContainerConfigFromJob(job *engine.Job) *Config { +func ContainerConfigFromJob(env *engine.Env) *Config { config := &Config{ - Hostname: job.Getenv("Hostname"), - Domainname: job.Getenv("Domainname"), - User: job.Getenv("User"), - Memory: job.GetenvInt64("Memory"), - MemorySwap: job.GetenvInt64("MemorySwap"), - CpuShares: job.GetenvInt64("CpuShares"), - Cpuset: job.Getenv("Cpuset"), - AttachStdin: job.GetenvBool("AttachStdin"), - AttachStdout: job.GetenvBool("AttachStdout"), - AttachStderr: job.GetenvBool("AttachStderr"), - Tty: job.GetenvBool("Tty"), - OpenStdin: job.GetenvBool("OpenStdin"), - StdinOnce: job.GetenvBool("StdinOnce"), - Image: job.Getenv("Image"), - WorkingDir: job.Getenv("WorkingDir"), - NetworkDisabled: job.GetenvBool("NetworkDisabled"), - MacAddress: job.Getenv("MacAddress"), + Hostname: env.Get("Hostname"), + Domainname: env.Get("Domainname"), + User: env.Get("User"), + Memory: env.GetInt64("Memory"), + MemorySwap: env.GetInt64("MemorySwap"), + CpuShares: env.GetInt64("CpuShares"), + Cpuset: env.Get("Cpuset"), + AttachStdin: env.GetBool("AttachStdin"), + AttachStdout: env.GetBool("AttachStdout"), + AttachStderr: env.GetBool("AttachStderr"), + Tty: env.GetBool("Tty"), + OpenStdin: env.GetBool("OpenStdin"), + StdinOnce: env.GetBool("StdinOnce"), + Image: env.Get("Image"), + WorkingDir: env.Get("WorkingDir"), + NetworkDisabled: env.GetBool("NetworkDisabled"), + MacAddress: env.Get("MacAddress"), } - job.GetenvJson("ExposedPorts", &config.ExposedPorts) - job.GetenvJson("Volumes", &config.Volumes) - if PortSpecs := job.GetenvList("PortSpecs"); PortSpecs != nil { + env.GetJson("ExposedPorts", &config.ExposedPorts) + env.GetJson("Volumes", &config.Volumes) + if PortSpecs := env.GetList("PortSpecs"); PortSpecs != nil { config.PortSpecs = PortSpecs } - if Env := job.GetenvList("Env"); Env != nil { + if Env := env.GetList("Env"); Env != nil { config.Env = Env } - if Cmd := job.GetenvList("Cmd"); Cmd != nil { + if Cmd := env.GetList("Cmd"); Cmd != nil { config.Cmd = Cmd } - job.GetenvJson("Labels", &config.Labels) + env.GetJson("Labels", &config.Labels) - if Entrypoint := job.GetenvList("Entrypoint"); Entrypoint != nil { + if Entrypoint := env.GetList("Entrypoint"); Entrypoint != nil { config.Entrypoint = Entrypoint } return config