diff --git a/Dockerfile b/Dockerfile
index 080befc..94d55a6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,9 +1,9 @@
 # Use an official Python runtime as a parent image
-FROM python:3.10
+FROM python:3.12
 
 # Set environment variables
-ENV PYTHONDONTWRITEBYTECODE 1
-ENV PYTHONUNBUFFERED 1
+ENV PYTHONDONTWRITEBYTECODE=1
+ENV PYTHONUNBUFFERED=1
 
 # Set the working directory
 WORKDIR /app
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 5ef4913..0291ff5 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -1,7 +1,7 @@
 version: '3'
 services:
   db:
-    image: mysql:8.0.36
+    image: mysql:8.4
     container_name: error_report_web_db
     restart: always
     volumes:
diff --git a/docker/run-tests.sh b/docker/run-tests.sh
index 54aaa8b..2eafd98 100755
--- a/docker/run-tests.sh
+++ b/docker/run-tests.sh
@@ -17,7 +17,7 @@ trap 'docker rm -f $DB >/dev/null; docker network rm $NET >/dev/null' EXIT
 # Root so Django can create the test database; testingpw isn't a secret.
 docker run -d --name $DB --network $NET --network-alias db \
     -e MYSQL_ROOT_PASSWORD=testingpw -e MYSQL_DATABASE=errorreport \
-    mysql:8.0.36 >/dev/null
+    mysql:8.4 >/dev/null
 until docker exec $DB mysql -h127.0.0.1 -uroot -ptestingpw -e 'SELECT 1' >/dev/null 2>&1; do
     if [ "$(docker inspect -f '{{.State.Running}}' $DB)" != true ]; then
         docker logs $DB | tail -5; exit 1
