diff --git a/changelog.d/18275.docker b/changelog.d/18275.docker
new file mode 100644
index 0000000000..154226e5f6
--- /dev/null
+++ b/changelog.d/18275.docker
@@ -0,0 +1 @@
+Use uv pip to install supervisor in the worker image.
diff --git a/docker/Dockerfile-workers b/docker/Dockerfile-workers
index 3dec4bba05..dd0bf59994 100644
--- a/docker/Dockerfile-workers
+++ b/docker/Dockerfile-workers
@@ -27,10 +27,15 @@ FROM docker.io/library/redis:7-${DEBIAN_VERSION} AS redis_base
 # now build the final image, based on the the regular Synapse docker image
 FROM $FROM
 
-    # Install supervisord with pip instead of apt, to avoid installing a second
+    # Install supervisord with uv pip instead of apt, to avoid installing a second
     # copy of python.
-    RUN --mount=type=cache,target=/root/.cache/pip \
-        pip install supervisor~=4.2
+    # --link-mode=copy silences a warning as uv isn't able to do hardlinks between its cache
+    # (mounted as --mount=type=cache) and the target directory.
+    RUN \
+         --mount=type=bind,from=ghcr.io/astral-sh/uv:0.6.8,source=/uv,target=/uv \
+         --mount=type=cache,target=/root/.cache/uv \
+        /uv pip install --link-mode=copy --prefix="/usr/local" supervisor~=4.2
+
     RUN mkdir -p /etc/supervisor/conf.d
 
     # Copy over redis and nginx