diff --git a/docker/glance/glance-api/extend_start.sh b/docker/glance/glance-api/extend_start.sh
index 3d8d7f512c..3363539a50 100644
--- a/docker/glance/glance-api/extend_start.sh
+++ b/docker/glance/glance-api/extend_start.sh
@@ -7,3 +7,21 @@ if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
     glance-manage db_load_metadefs
     exit 0
 fi
+
+# Migrate database and exit if KOLLA_UPGRADE variable is set. This catches all cases
+# of the KOLLA_UPGRADE variable being set, including empty.
+if [[ "${!KOLLA_UPGRADE[@]}" ]]; then
+    if [[ "${!GLANCE_DB_EXPAND[@]}" ]]; then
+        echo "Expanding database"
+        glance-manage db expand
+    fi
+    if [[ "${!GLANCE_DB_MIGRATE[@]}" ]]; then
+        echo "Migrating database"
+        glance-manage db migrate
+    fi
+    if [[ "${!GLANCE_DB_CONTRACT[@]}" ]]; then
+        echo "Contracting database"
+        glance-manage db contract
+    fi
+    exit 0
+fi
diff --git a/releasenotes/notes/implement-glance-zero-downtime-upgrade-2825a2c76315d23d.yaml b/releasenotes/notes/implement-glance-zero-downtime-upgrade-2825a2c76315d23d.yaml
new file mode 100644
index 0000000000..b1c7a7c113
--- /dev/null
+++ b/releasenotes/notes/implement-glance-zero-downtime-upgrade-2825a2c76315d23d.yaml
@@ -0,0 +1,5 @@
+---
+
+features:
+  - |
+    Implement Glance zero-downtime upgrade logic.