diff --git a/container.go b/container.go index c5df1f4b58..c98982b111 100644 --- a/container.go +++ b/container.go @@ -104,6 +104,44 @@ type Config struct { NetworkDisabled bool } +func ContainerConfigFromJob(job *engine.Job) *Config { + var config Config + config.Hostname = job.Getenv("Hostname") + config.Domainname = job.Getenv("Domainname") + config.User = job.Getenv("User") + config.Memory = job.GetenvInt64("Memory") + config.MemorySwap = job.GetenvInt64("MemorySwap") + config.CpuShares = job.GetenvInt64("CpuShares") + config.AttachStdin = job.GetenvBool("AttachStdin") + config.AttachStdout = job.GetenvBool("AttachStdout") + config.AttachStderr = job.GetenvBool("AttachStderr") + if PortSpecs := job.GetenvList("PortSpecs"); PortSpecs != nil { + config.PortSpecs = PortSpecs + } + job.GetenvJson("ExposedPorts", &config.ExposedPorts) + config.Tty = job.GetenvBool("Tty") + config.OpenStdin = job.GetenvBool("OpenStdin") + config.StdinOnce = job.GetenvBool("StdinOnce") + if Env := job.GetenvList("Env"); Env != nil { + config.Env = Env + } + if Cmd := job.GetenvList("Cmd"); Cmd != nil { + config.Cmd = Cmd + } + if Dns := job.GetenvList("Dns"); Dns != nil { + config.Dns = Dns + } + config.Image = job.Getenv("Image") + job.GetenvJson("Volumes", &config.Volumes) + config.VolumesFrom = job.Getenv("VolumesFrom") + config.WorkingDir = job.Getenv("WorkingDir") + if Entrypoint := job.GetenvList("Entrypoint"); Entrypoint != nil { + config.Entrypoint = Entrypoint + } + config.NetworkDisabled = job.GetenvBool("NetworkDisabled") + return &config +} + type HostConfig struct { Binds []string ContainerIDFile string @@ -114,6 +152,22 @@ type HostConfig struct { PublishAllPorts bool } +func ContainerHostConfigFromJob(job *engine.Job) *HostConfig { + var hostConfig HostConfig + if Binds := job.GetenvList("Binds"); Binds != nil { + hostConfig.Binds = Binds + } + hostConfig.ContainerIDFile = job.Getenv("ContainerIDFile") + job.GetenvJson("LxcConf", &hostConfig.LxcConf) + hostConfig.Privileged = job.GetenvBool("Privileged") + job.GetenvJson("PortBindings", &hostConfig.PortBindings) + if Links := job.GetenvList("Links"); Links != nil { + hostConfig.Links = Links + } + hostConfig.PublishAllPorts = job.GetenvBool("PublishAllPorts") + return &hostConfig +} + type BindMap struct { SrcPath string DstPath string diff --git a/engine/env.go b/engine/env.go index f93555a40b..e000fe26b1 100644 --- a/engine/env.go +++ b/engine/env.go @@ -191,24 +191,6 @@ func (env *Env) WriteTo(dst io.Writer) (n int64, err error) { return 0, env.Encode(dst) } -func (env *Env) Export(dst interface{}) (err error) { - defer func() { - if err != nil { - err = fmt.Errorf("ExportEnv %s", err) - } - }() - var buf bytes.Buffer - // step 1: encode/marshal the env to an intermediary json representation - if err := env.Encode(&buf); err != nil { - return err - } - // step 2: decode/unmarshal the intermediary json into the destination object - if err := json.NewDecoder(&buf).Decode(dst); err != nil { - return err - } - return nil -} - func (env *Env) Import(src interface{}) (err error) { defer func() { if err != nil { diff --git a/engine/env_test.go b/engine/env_test.go index 24c5992dd0..419c47491e 100644 --- a/engine/env_test.go +++ b/engine/env_test.go @@ -84,32 +84,6 @@ func TestSetenvList(t *testing.T) { } } -func TestImportEnv(t *testing.T) { - type dummy struct { - DummyInt int - DummyStringArray []string - } - - job := mkJob(t, "dummy") - if err := job.ImportEnv(&dummy{42, []string{"foo", "bar"}}); err != nil { - t.Fatal(err) - } - - dmy := dummy{} - if err := job.ExportEnv(&dmy); err != nil { - t.Fatal(err) - } - - if dmy.DummyInt != 42 { - t.Fatalf("Expected 42, got %d", dmy.DummyInt) - } - - if len(dmy.DummyStringArray) != 2 || dmy.DummyStringArray[0] != "foo" || dmy.DummyStringArray[1] != "bar" { - t.Fatalf("Expected {foo, bar}, got %v", dmy.DummyStringArray) - } - -} - func TestEnviron(t *testing.T) { job := mkJob(t, "dummy") job.Setenv("foo", "bar") diff --git a/engine/job.go b/engine/job.go index 179b2ebdda..181eaa80c7 100644 --- a/engine/job.go +++ b/engine/job.go @@ -164,10 +164,6 @@ func (job *Job) EncodeEnv(dst io.Writer) error { return job.env.Encode(dst) } -func (job *Job) ExportEnv(dst interface{}) (err error) { - return job.env.Export(dst) -} - func (job *Job) ImportEnv(src interface{}) (err error) { return job.env.Import(src) } diff --git a/server.go b/server.go index a6731842cc..5a3b999c43 100644 --- a/server.go +++ b/server.go @@ -1742,11 +1742,7 @@ func (srv *Server) ContainerCreate(job *engine.Job) engine.Status { job.Printf("Usage: %s", job.Name) return engine.StatusErr } - var config Config - if err := job.ExportEnv(&config); err != nil { - job.Error(err) - return engine.StatusErr - } + config := ContainerConfigFromJob(job) if config.Memory != 0 && config.Memory < 524288 { job.Errorf("Minimum memory limit allowed is 512k") return engine.StatusErr @@ -1769,7 +1765,7 @@ func (srv *Server) ContainerCreate(job *engine.Job) engine.Status { config.Dns = defaultDns } - container, buildWarnings, err := srv.runtime.Create(&config, name) + container, buildWarnings, err := srv.runtime.Create(config, name) if err != nil { if srv.runtime.graph.IsNotExist(err) { _, tag := utils.ParseRepositoryTag(config.Image) @@ -2196,11 +2192,7 @@ func (srv *Server) ContainerStart(job *engine.Job) engine.Status { } // If no environment was set, then no hostconfig was passed. if len(job.Environ()) > 0 { - var hostConfig HostConfig - if err := job.ExportEnv(&hostConfig); err != nil { - job.Error(err) - return engine.StatusErr - } + hostConfig := ContainerHostConfigFromJob(job) // Validate the HostConfig binds. Make sure that: // 1) the source of a bind mount isn't / // The bind mount "/:/foo" isn't allowed. @@ -2227,11 +2219,11 @@ func (srv *Server) ContainerStart(job *engine.Job) engine.Status { } } // Register any links from the host config before starting the container - if err := srv.RegisterLinks(container, &hostConfig); err != nil { + if err := srv.RegisterLinks(container, hostConfig); err != nil { job.Error(err) return engine.StatusErr } - container.hostConfig = &hostConfig + container.hostConfig = hostConfig container.ToDisk() } if err := container.Start(); err != nil {