diff --git a/ci/docker_images/ubuntu/jammy_cuda/Dockerfile b/ci/docker_images/ubuntu/jammy_cuda/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..fe862b1e3b60ffcd484aada031f98ab9efe4ad0b
--- /dev/null
+++ b/ci/docker_images/ubuntu/jammy_cuda/Dockerfile
@@ -0,0 +1,225 @@
+##
+## Copyright (C) HySoP 2011-2022
+##
+## Licensed under the Apache License, Version 2.0 (the "License");
+## you may not use this file except in compliance with the License.
+## You may obtain a copy of the License at
+##
+##         http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+##
+
+# Test docker for gitlab-ci
+FROM nvidia/cuda:11.7.1-devel-ubuntu22.04
+MAINTAINER Jean-Baptiste.Keck@imag.fr
+
+# parallel builds
+ARG NTHREADS
+ENV MAKEFLAGS "-j${NTHREADS}"
+
+# upgrade initial image
+ENV DEBIAN_FRONTEND noninteractive
+RUN apt-get update && apt-get full-upgrade -y
+
+# get build tools and required libraries
+RUN apt-get update && apt-get install -y --no-install-recommends expat unzip xz-utils automake libtool pkg-config cmake rsync git vim ssh curl wget ca-certificates gcc g++ gfortran lsb-core cpio libnuma1 libpciaccess0 libreadline-dev libblas-dev liblapack-dev libgcc-11-dev libgfortran-11-dev libgmp-dev libmpfr-dev libmpc-dev python3.10-dev opencl-headers swig libgmp-dev libmpfr-dev libmpc-dev libcairo-dev libcairomm-1.0-dev python3.10-tk
+
+# python-pip
+RUN cd /tmp && \
+ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
+ python3.10 get-pip.py && \
+ python3.10 -m pip install --upgrade pip && \
+ rm -f /tmp/get-pip.py
+
+RUN python3.10 -m pip install --upgrade numpy==1.21.5 setuptools cffi wheel pytest pybind11 cython
+
+# OpenMPI 4.1.2 + mpi4py (enable mpi1 compatibility for mpi4py)
+ENV MPI_ROOT "/usr/local"
+RUN cd /tmp && \
+ wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.4.tar.gz && \
+ tar -xvzf openmpi-*.tar.gz && \
+ rm -f openmpi-*.tar.gz && \
+ cd openmpi-* && \
+ ./configure --enable-shared --disable-static --enable-ipv6 --prefix="${MPI_ROOT}" --with-hwloc=internal --with-libevent=internal --enable-mpi1-compatibility && \
+ make && \
+ make install && \
+ rm -rf /tmp/openmpi-*
+
+ENV MPICC "${MPI_ROOT}/bin/mpicc"
+RUN ldconfig && python3.10 -m pip install --upgrade mpi4py -vvv
+
+# HPTT (CPU tensor permutation library)
+RUN cd /tmp && \
+ git clone https://gitlab.com/keckj/hptt.git && \
+ cd hptt && \
+ sed -i "s#-mavx##g" CMakeLists.txt && \
+ sed -i "s#-march=native##g" CMakeLists.txt && \
+ sed -i "s#-mtune=native##g" CMakeLists.txt && \
+ mkdir build && \
+ cd build && \
+ cmake -DCMAKE_BUILD_TYPE=Release .. && \
+ make && \
+ make install && \
+ cd ../pythonAPI && \
+ python3.10 -m pip install --upgrade . && \
+ cd /tmp && \
+ rm -rf /tmp/hptt
+
+# HDF5 1.12.1 + h5py 3.6.0
+RUN cd /tmp && \
+ wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.12/hdf5-1.12.1/src/hdf5-1.12.1.tar.gz && \
+ tar -xvzf hdf5-*.tar.gz && \
+ rm -f hdf5-*.tar.gz && \
+ cd hdf5-* && \
+ CC="${MPICC}" ./configure --prefix="${MPI_ROOT}" --enable-parallel --enable-shared=yes --enable-static=no && \
+ make && \
+ make install && \
+ rm -rf /tmp/hdf5-*
+RUN CC="${MPICC}" HDF5_MPI="ON" HDF5_VERSION="1.12.1" HDF5_DIR="${MPI_ROOT}" python3.10 -m pip install --upgrade --no-binary=h5py h5py -vvv
+
+# other python packages
+RUN python3.10 -m pip install --upgrade scipy sympy matplotlib gmpy2 psutil py-cpuinfo Mako editdistance portalocker colors.py tee pycairo argparse_color_formatter networkx pyvis zarr numcodecs jsonpickle memory-tempfile primefac
+
+# llvm + numba + llvmlite (numba 0.55.1 only supports llvm 11 for now)
+RUN apt-get update && \
+ apt-get install -y llvm-11-dev libclang-11-dev clang-11
+ENV LLVM_CONFIG=llvm-config-11
+RUN python3.10 -m pip install --upgrade numba llvmlite
+
+# clinfo 3.0.21.02.21 (2021)
+ENV LIBRARY_PATH="/usr/local/cuda/targets/x86_64-linux/lib"
+RUN cd /tmp && \
+ wget https://github.com/Oblomov/clinfo/archive/refs/tags/3.0.21.02.21.tar.gz && \
+ tar -xvzf *.tar.gz && \
+ rm -f *.tar.gz && \
+ cd clinfo-* && \
+ make && \
+ ./clinfo && \
+ mv ./clinfo /bin/ && \
+ rm -rf /tmp/clinfo-*
+
+# clpeak 1.1.2 (2022)
+RUN cd /tmp && \
+ wget https://github.com/krrishnarraj/clpeak/archive/1.1.2.tar.gz && \
+ tar -xvzf *.tar.gz && \
+ rm -f *.tar.gz && \
+ cd clpeak-* && \
+ mkdir build && \
+ cd build/ && \
+ cmake .. && \
+ make && \
+ mv ./clpeak /bin/ && \
+ rm -rf /tmp/clpeak-*
+
+# pyopencl
+RUN cd /tmp && \
+ git clone https://github.com/inducer/pyopencl.git && \
+ cd pyopencl && \
+ git checkout v2022.2.3 && \
+ git submodule update --init && \
+ python3.10 configure.py && \
+ make && \
+ python3.10 -m pip install --upgrade . && \
+ cd - && \
+ rm -rf /tmp/pyopencl
+
+# oclgrind
+RUN cd /tmp && \
+ git clone https://github.com/jrprice/Oclgrind.git && \
+ cd Oclgrind && \
+ mkdir build && \
+ cd build && \
+ cmake -DCMAKE_BUILD_TYPE=Release .. && \
+ make && \
+ make install && \
+ cd - && \
+ rm -rf /tmp/Oclgrind
+
+# clFFT
+RUN cd /tmp && \
+ ln -s /usr/local/lib /usr/local/lib64 && \
+ git clone https://github.com/clMathLibraries/clFFT.git && \
+ cd clFFT && \
+ cd src && \
+ mkdir build && \
+ cd build && \
+ cmake -DCMAKE_BUILD_TYPE=Release .. && \
+ make && \
+ make install && \
+ cd - && \
+ rm -rf /tmp/clFFT
+
+# gpyFFT, we need to fix a segfault on weakref.finalize(plan)
+# clFFT plans are destroyed when atexit(clFFT.teardown) is called
+RUN cd /tmp && \
+ git clone https://github.com/geggo/gpyfft.git && \
+ cd gpyfft && \
+ sed 's#finalize(self, _destroy_plan, self.plan)##' -i gpyfft/gpyfftlib.pyx && \
+ python3.10 -m pip install . && \
+ cd - && \
+ rm -rf /tmp/gpyfft
+
+# python flint (FLINT2 + ARB + python-flint)
+RUN cd /tmp && \
+  wget https://github.com/wbhart/flint2/archive/v2.8.4.tar.gz && \
+  tar -xvzf v*.tar.gz && \
+  rm -f v*.tar.gz && \
+  cd flint2-* && \
+  ./configure && \
+  make && \
+  make install && \
+  cd - && \
+  rm -rf flint2-*
+RUN cd /tmp && \
+  wget https://github.com/fredrik-johansson/arb/archive/2.22.1.tar.gz && \
+  tar -xvzf *.tar.gz && \
+  rm -f *.tar.gz && \
+  cd arb-* && \
+  ./configure && \
+  make && \
+  make install && \
+  cd - && \
+  rm -rf arb-*
+RUN python3.10 -m pip install --upgrade python-flint -vvv
+
+# static fftw + pyfftw (with R2R transforms)
+# Weird pyfftw bug : not passing -O2 explicitely during build causes a segfault on import...
+# See https://bugs.gentoo.org/548776
+ENV FFTW_ROOT="/usr/local"
+RUN cd /tmp && \
+ wget http://www.fftw.org/fftw-3.3.10.tar.gz && \
+ tar -xvzf fftw-*.tar.gz && \
+ rm -f fftw-*.tar.gz && \
+ cd fftw-* && \
+ ./configure --enable-openmp --enable-threads --enable-mpi --enable-static --with-pic --prefix="${FFTW_ROOT}" --enable-single && \
+ make && make install && make clean && \
+ ./configure --enable-openmp --enable-threads --enable-mpi --enable-static --with-pic --prefix="${FFTW_ROOT}" && \
+ make && make install && make clean && \
+ ./configure --enable-openmp --enable-threads --enable-mpi --enable-static --with-pic --prefix="${FFTW_ROOT}" --enable-long-double && \
+ make && make install && make clean && \
+ rm -rf /tmp/fftw-*
+
+RUN cd /tmp && \
+ git clone https://github.com/pyFFTW/pyFFTW && \
+ cd pyFFTW && \
+ STATIC_FFTW_DIR="${FFTW_ROOT}/lib" CFLAGS="-Wl,-Bsymbolic -fopenmp -I${FFTW_ROOT}/include -O2" python3.10 setup.py build_ext --inplace && \
+ python3.10 -m pip install --upgrade . && \
+ rm -rf /tmp/pyFFTW
+
+RUN python3.10 -m pip install ansicolors --ignore-installed
+RUN python3.10 -m pip install numpy==1.21.5
+
+# ensure all libraries are known by the runtime linker
+RUN ldconfig
+
+# clean cached packages
+RUN rm -rf /var/lib/apt/lists/*
+RUN rm -rf $HOME/.cache/pip/*
+RUN rm -rf /tmp/*
+
+CMD ["/bin/bash"]