diff --git a/metadata/environment.go b/metadata/environment.go
index d4e3a534ffcc4cb6d63e96b7b94fbc0fc40c426b..8d1e8ef72114c60c7a190e6e1b75536fdbdb5112 100644
--- a/metadata/environment.go
+++ b/metadata/environment.go
@@ -16,9 +16,11 @@
 package metadata
 
 import (
+	"bytes"
 	"encoding/json"
 	"fmt"
 	"os"
+	"path"
 	"path/filepath"
 	"strings"
 
@@ -121,6 +123,17 @@ func (m *manager) createEnvironment(name, uri string, extensionsLibData, k8sLibD
 		return err
 	}
 
+	// Generate the base.libsonnet override file
+	overrideFileName := path.Base(name) + ".jsonnet"
+	overrideData := m.generateOverrideData()
+	log.Debugf("Generating '%s', length: %d", overrideFileName, len(overrideData))
+	overrideLibPath := appendToAbsPath(envPath, overrideFileName)
+	err = afero.WriteFile(m.appFS, string(overrideLibPath), overrideData, defaultFilePermissions)
+	if err != nil {
+		log.Debugf("Failed to write '%s'", overrideFileName)
+		return err
+	}
+
 	// Generate the environment spec file.
 	envSpecData, err := generateSpecData(uri)
 	if err != nil {
@@ -334,6 +347,16 @@ func (m *manager) generateKsonnetLibData(spec ClusterSpec) ([]byte, []byte, []by
 	return extensionsLibData, k8sLibData, text, err
 }
 
+func (m *manager) generateOverrideData() []byte {
+	var buf bytes.Buffer
+	buf.WriteString(fmt.Sprintf("local base = import \"%s\";\n", m.baseLibsonnetPath))
+	buf.WriteString(fmt.Sprintf("local k = import \"%s\";\n\n", path.Join(metadataDirName, extensionsLibFilename)))
+	buf.WriteString("base + {\n")
+	buf.WriteString("  // Insert user-specified overrides here.\n")
+	buf.WriteString("}\n")
+	return buf.Bytes()
+}
+
 func generateSpecData(uri string) ([]byte, error) {
 	// Format the spec json and return; preface keys with 2 space idents.
 	return json.MarshalIndent(EnvironmentSpec{URI: uri}, "", "  ")
diff --git a/metadata/environment_test.go b/metadata/environment_test.go
index 2d9d2d73925cf48b3a4dcc1758662fabce4fe242..d922b6fce1f50c2e09e0e628a54b05d1c69a739d 100644
--- a/metadata/environment_test.go
+++ b/metadata/environment_test.go
@@ -180,3 +180,20 @@ func TestSetEnvironment(t *testing.T) {
 		t.Fatalf("Expected set URI to be \"%s\", got:\n  %s", set.URI, envSpec.URI)
 	}
 }
+
+func TestGenerateOverrideData(t *testing.T) {
+	m := mockEnvironments(t, "test-gen-override-data")
+
+	expected := `local base = import "test-gen-override-data/environments/base.libsonnet";
+local k = import ".metadata/k.libsonnet";
+
+base + {
+  // Insert user-specified overrides here.
+}
+`
+	result := m.generateOverrideData()
+
+	if string(result) != expected {
+		t.Fatalf("Expected to generate override file with data:\n%s\n,got:\n%s", expected, result)
+	}
+}