fix: use correct base image
diff --git a/internal/pkg/image_repositories/build_workflow.go b/internal/pkg/image_repositories/build_workflow.go
index 92084b9..2864a57 100644
--- a/internal/pkg/image_repositories/build_workflow.go
+++ b/internal/pkg/image_repositories/build_workflow.go
@@ -77,6 +77,7 @@
 	}
 
 	buildArgs := []string{
+		"RUNTIME_IMAGE=quay.io/vexxhost/openstack-runtime-${{ matrix.from }}",
 		"RELEASE=${{ matrix.release }}",
 		fmt.Sprintf("PROJECT=%s", project),
 		fmt.Sprintf("PROJECT_REPO=%s", gitRepo),
@@ -105,8 +106,23 @@
 			"image": {
 				RunsOn: "ubuntu-latest",
 				Strategy: GithubWorkflowStrategy{
-					Matrix: map[string][]string{
-						"release": {"wallaby", "xena", "yoga", "zed"},
+					Matrix: map[string]interface{}{
+						"from":    []string{"focal", "jammy"},
+						"release": []string{"wallaby", "xena", "yoga", "zed"},
+						"exclude": []map[string]string{
+							{
+								"from":    "focal",
+								"release": "zed",
+							},
+							{
+								"from":    "jammy",
+								"release": "wallaby",
+							},
+							{
+								"from":    "jammy",
+								"release": "xena",
+							},
+						},
 					},
 				},
 				Steps: []GithubWorkflowStep{
@@ -141,20 +157,24 @@
 						Uses: "docker/build-push-action@v3",
 						With: map[string]string{
 							"context":    ".",
-							"cache-from": "type=gha,scope=${{ matrix.release }}",
-							"cache-to":   "type=gha,mode=max,scope=${{ matrix.release }}",
+							"cache-from": "type=gha,scope=${{ matrix.from }}-${{ matrix.release }}",
+							"cache-to":   "type=gha,mode=max,scope=${{ matrix.from }}-${{ matrix.release }}",
 							"platforms":  platforms,
 							"push":       "${{ github.event_name == 'push' }}",
 							"build-args": strings.Join(buildArgs, "\n"),
-							"tags":       fmt.Sprintf("quay.io/vexxhost/%s:${{ env.PROJECT_REF }}", project),
+							"tags":       fmt.Sprintf("quay.io/vexxhost/%s:${{ env.PROJECT_REF }}-${{ matrix.from }}", project),
 						},
 					},
 					{
 						Name: "Promote image",
 						Uses: "akhilerm/tag-push-action@v2.0.0",
-						If:   "github.ref == 'refs/heads/main'",
+						If: `
+							github.event_name == 'push' && (
+							(matrix.from == 'focal') ||
+							(matrix.from == 'jammy' && matrix.release != 'yoga')
+						)`,
 						With: map[string]string{
-							"src": fmt.Sprintf("quay.io/vexxhost/%s:${{ env.PROJECT_REF }}", project),
+							"src": fmt.Sprintf("quay.io/vexxhost/%s:${{ env.PROJECT_REF }}-${{ matrix.from }}", project),
 							"dst": fmt.Sprintf("quay.io/vexxhost/%s:${{ matrix.release }}", project),
 						},
 					},
diff --git a/internal/pkg/image_repositories/github_workflow.go b/internal/pkg/image_repositories/github_workflow.go
index d4d6763..7927e92 100644
--- a/internal/pkg/image_repositories/github_workflow.go
+++ b/internal/pkg/image_repositories/github_workflow.go
@@ -56,7 +56,7 @@
 }
 
 type GithubWorkflowStrategy struct {
-	Matrix map[string][]string `yaml:"matrix"`
+	Matrix map[string]interface{} `yaml:"matrix"`
 }
 
 type GithubWorkflowStep struct {
diff --git a/internal/pkg/image_repositories/template/Dockerfile b/internal/pkg/image_repositories/template/Dockerfile
index 29257ae..567af2b 100644
--- a/internal/pkg/image_repositories/template/Dockerfile
+++ b/internal/pkg/image_repositories/template/Dockerfile
@@ -5,7 +5,8 @@
 FROM {{ .BuilderImage }}:{{ .BuilderImageTag }} AS builder
 COPY --from=bindep --link /runtime-pip-packages /runtime-pip-packages
 
-FROM {{ .RuntimeImage }}:{{ .RuntimeImageTag }} AS runtime
+ARG RUNTIME_IMAGE={{ .RuntimeImage }}
+FROM ${FROM}:{{ .RuntimeImageTag }} AS runtime
 COPY --from=bindep --link /runtime-dist-packages /runtime-dist-packages
 COPY --from=builder --link /var/lib/openstack /var/lib/openstack