diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go index 8c900d5d9..216fa4d99 100644 --- a/drivers/docker/driver.go +++ b/drivers/docker/driver.go @@ -66,6 +66,13 @@ var ( nvidiaVisibleDevices = "NVIDIA_VISIBLE_DEVICES" ) +const ( + dockerLabelTaskID = "com.hashicorp.nomad.task_id" + dockerLabelTaskName = "com.hashicorp.nomad.task_name" + dockerLabelAllocID = "com.hashicorp.nomad.alloc_id" + dockerLabelJobName = "com.hashicorp.nomad.job_name" +) + type Driver struct { // eventer is used to handle multiplexing of TaskEvents calls such that an // event can be broadcast to all callers @@ -981,9 +988,19 @@ func (d *Driver) createContainerConfig(task *drivers.TaskConfig, driverConfig *T if len(driverConfig.Labels) > 0 { config.Labels = driverConfig.Labels - logger.Debug("applied labels on the container", "labels", config.Labels) } + config.Labels = map[string]string{ + dockerLabelTaskID: task.ID, + dockerLabelTaskName: task.Name, + dockerLabelAllocID: task.AllocID, + dockerLabelJobName: task.JobName, + } + for k, v := range driverConfig.Labels { + config.Labels[k] = v + } + logger.Debug("applied labels on the container", "labels", config.Labels) + config.Env = task.EnvList() containerName := fmt.Sprintf("%s-%s", strings.Replace(task.Name, "/", "_", -1), task.AllocID) diff --git a/drivers/docker/driver_test.go b/drivers/docker/driver_test.go index a100aa743..c7fafe448 100644 --- a/drivers/docker/driver_test.go +++ b/drivers/docker/driver_test.go @@ -905,7 +905,8 @@ func TestDockerDriver_Labels(t *testing.T) { t.Fatalf("err: %v", err) } - require.Equal(t, 2, len(container.Config.Labels)) + // expect to see 4 additional standard labels + require.Equal(t, len(cfg.Labels)+4, len(container.Config.Labels)) for k, v := range cfg.Labels { require.Equal(t, v, container.Config.Labels[k]) } @@ -1008,6 +1009,38 @@ func TestDockerDriver_CreateContainerConfig(t *testing.T) { require.Equal(t, containerName, c.Name) } +func TestDockerDriver_CreateContainerConfig_Labels(t *testing.T) { + t.Parallel() + + task, cfg, _ := dockerTask(t) + task.AllocID = uuid.Generate() + task.JobName = "redis-demo-job" + + cfg.Labels = map[string]string{ + "user_label": "user_value", + } + + require.NoError(t, task.EncodeConcreteDriverConfig(cfg)) + + dh := dockerDriverHarness(t, nil) + driver := dh.Impl().(*Driver) + + c, err := driver.createContainerConfig(task, cfg, "org/repo:0.1") + require.NoError(t, err) + + expectedLabels := map[string]string{ + // user provided labels + "user_label": "user_value", + // default labels + "com.hashicorp.nomad.alloc_id": task.AllocID, + "com.hashicorp.nomad.job_name": "redis-demo-job", + "com.hashicorp.nomad.task_id": task.ID, + "com.hashicorp.nomad.task_name": "redis-demo", + } + + require.Equal(t, expectedLabels, c.Config.Labels) +} + func TestDockerDriver_CreateContainerConfig_Logging(t *testing.T) { t.Parallel()