diff --git a/ci/release-image/Dockerfile b/ci/release-image/Dockerfile
index f665a1588d74..c0eaa3de1176 100644
--- a/ci/release-image/Dockerfile
+++ b/ci/release-image/Dockerfile
@@ -42,6 +42,10 @@ RUN ARCH="$(dpkg --print-architecture)" && \
 COPY ci/release-image/entrypoint.sh /usr/bin/entrypoint.sh
 RUN --mount=from=packages,src=/tmp,dst=/tmp/packages dpkg -i /tmp/packages/code-server*$(dpkg --print-architecture).deb
 
+# Allow users to have scripts run on container startup to prepare workspace.
+# https://github.com/coder/code-server/issues/5177
+ENV ENTRYPOINTD=${HOME}/entrypoint.d
+
 EXPOSE 8080
 # This way, if someone sets $DOCKER_USER, docker-exec will still work as
 # the uid will remain the same. note: only relevant if -u isn't passed to
diff --git a/ci/release-image/entrypoint.sh b/ci/release-image/entrypoint.sh
index 9af98fbc3dc9..460b559ba9cb 100755
--- a/ci/release-image/entrypoint.sh
+++ b/ci/release-image/entrypoint.sh
@@ -18,4 +18,10 @@ if [ "${DOCKER_USER-}" ]; then
   fi
 fi
 
+# Allow users to have scripts run on container startup to prepare workspace.
+# https://github.com/coder/code-server/issues/5177
+if [ -d "${ENTRYPOINTD}" ]; then
+  find "${ENTRYPOINTD}" -type f -executable -print -exec {} \;
+fi
+
 exec dumb-init /usr/bin/code-server "$@"