From 9c17c0a1d84f7c6bd8e923c7da9fedae33e63856 Mon Sep 17 00:00:00 2001 From: Antoine POPINEAU Date: Wed, 30 Sep 2015 18:18:43 +0200 Subject: [PATCH] Added a jobspec directive to specify envvars. Updated Docker driver to use them accordingly. --- api/tasks.go | 1 + client/driver/docker.go | 8 +++++++- jobspec/parse.go | 14 ++++++++++++++ jobspec/parse_test.go | 4 ++++ jobspec/test-fixtures/basic.hcl | 4 ++++ nomad/structs/structs.go | 3 +++ 6 files changed, 33 insertions(+), 1 deletion(-) diff --git a/api/tasks.go b/api/tasks.go index 23e9ca638..c1d5bf2ff 100644 --- a/api/tasks.go +++ b/api/tasks.go @@ -44,6 +44,7 @@ type Task struct { Driver string Config map[string]string Constraints []*Constraint + Env map[string]string Resources *Resources Meta map[string]string } diff --git a/client/driver/docker.go b/client/driver/docker.go index 7f59e7ce3..feb842cc5 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -170,8 +170,14 @@ func createContainer(ctx *ExecContext, task *structs.Task, logger *log.Logger) d hostConfig.PortBindings = dockerPorts } + // Merge Nomad-native with user-specified envvars + env := TaskEnvironmentVariables(ctx, task).List() + for k, v := range task.Env { + env = append(env, fmt.Sprintf("%s=%s", k, v)) + } + config := &docker.Config{ - Env: TaskEnvironmentVariables(ctx, task).List(), + Env: env, Image: task.Config["image"], } diff --git a/jobspec/parse.go b/jobspec/parse.go index f1bed065d..1231b5ec0 100644 --- a/jobspec/parse.go +++ b/jobspec/parse.go @@ -284,6 +284,7 @@ func parseTasks(result *[]*structs.Task, obj *hclobj.Object) error { return err } delete(m, "config") + delete(m, "env") delete(m, "constraint") delete(m, "meta") delete(m, "resources") @@ -295,6 +296,19 @@ func parseTasks(result *[]*structs.Task, obj *hclobj.Object) error { return err } + // If we have env, then parse them + if o := o.Get("env", false); o != nil { + for _, o := range o.Elem(false) { + var m map[string]interface{} + if err := hcl.DecodeObject(&m, o); err != nil { + return err + } + if err := mapstructure.WeakDecode(m, &t.Env); err != nil { + return err + } + } + } + // If we have config, then parse that if o := o.Get("config", false); o != nil { for _, o := range o.Elem(false) { diff --git a/jobspec/parse_test.go b/jobspec/parse_test.go index d26907a60..dea59ec26 100644 --- a/jobspec/parse_test.go +++ b/jobspec/parse_test.go @@ -86,6 +86,10 @@ func TestParse(t *testing.T) { Config: map[string]string{ "image": "hashicorp/binstore", }, + Env: map[string]string{ + "HELLO": "world", + "LOREM": "ipsum", + }, Resources: &structs.Resources{ CPU: 500, MemoryMB: 128, diff --git a/jobspec/test-fixtures/basic.hcl b/jobspec/test-fixtures/basic.hcl index f57162938..9378327f8 100644 --- a/jobspec/test-fixtures/basic.hcl +++ b/jobspec/test-fixtures/basic.hcl @@ -36,6 +36,10 @@ job "binstore-storagelocker" { config { image = "hashicorp/binstore" } + env { + HELLO = "world" + PLOP = "coucou" + } resources { cpu = 500 memory = 128 diff --git a/nomad/structs/structs.go b/nomad/structs/structs.go index 02e735dd5..098c57b32 100644 --- a/nomad/structs/structs.go +++ b/nomad/structs/structs.go @@ -966,6 +966,9 @@ type Task struct { // Config is provided to the driver to initialize Config map[string]string + // Map of environment variables to be used by the driver + Env map[string]string + // Constraints can be specified at a task level and apply only to // the particular task. Constraints []*Constraint