diff --git a/.github/workflows/docker-push.yaml b/.github/workflows/docker-push.yaml index b69a572a..503fe74c 100644 --- a/.github/workflows/docker-push.yaml +++ b/.github/workflows/docker-push.yaml @@ -5,7 +5,7 @@ on: branches: - main paths: - - 'Dockerfile*' + - 'images/Dockerfile*' workflow_dispatch: jobs: @@ -14,15 +14,16 @@ jobs: strategy: matrix: - image: - - name: base + include: + - tag: latest dockerfile: Dockerfile - - name: matlab - dockerfile: Dockerfile.matlab - - name: gpu + - tag: latest-allensdk + dockerfile: Dockerfile.allensdk + - tag: latest-gpu dockerfile: Dockerfile.gpu - - name: gpu-matlab - dockerfile: Dockerfile.gpu.matlab + - tag: latest-gpu-allensdk + dockerfile: Dockerfile.gpu.allensdk + steps: - name: Checkout repository uses: actions/checkout@v4 @@ -42,10 +43,10 @@ jobs: - name: Build and push Docker Image uses: docker/build-push-action@v6 with: - context: images - file: ${{ matrix.dockerfile }} + context: ./images + file: ./images/${{ matrix.dockerfile }} push: true tags: | - ${{ secrets.DOCKERHUB_DANDIHUB_USERNAME }}/dandihub:latest-${{ matrix.image.name }} - cache-from: type=registry,ref=${{ secrets.DOCKERHUB_DANDIHUB_USERNAME }}/dandihub:latest-${{ matrix.image.name }} + ${{ secrets.DOCKERHUB_DANDIHUB_USERNAME }}/dandihub:${{ matrix.tag }} + cache-from: type=registry,ref=${{ secrets.DOCKERHUB_DANDIHUB_USERNAME }}/dandihub:${{ matrix.tag }} cache-to: type=inline \ No newline at end of file diff --git a/.github/workflows/docker-test.yaml b/.github/workflows/docker-test.yaml index 89bdf7b1..0b17cade 100644 --- a/.github/workflows/docker-test.yaml +++ b/.github/workflows/docker-test.yaml @@ -3,7 +3,7 @@ name: Build Docker Images on: pull_request: paths: - - 'Dockerfile*' + - 'images/Dockerfile*' workflow_dispatch: jobs: @@ -12,15 +12,16 @@ jobs: strategy: matrix: - image: - - name: base + include: + - tag: latest dockerfile: Dockerfile - - name: matlab - dockerfile: Dockerfile.matlab - - name: gpu + - tag: latest-allensdk + dockerfile: Dockerfile.allensdk + - tag: latest-gpu dockerfile: Dockerfile.gpu - - name: gpu-matlab - dockerfile: Dockerfile.gpu.matlab + - tag: latest-gpu-allensdk + dockerfile: Dockerfile.gpu.allensdk + steps: - name: Checkout repository uses: actions/checkout@v4 @@ -34,8 +35,8 @@ jobs: - name: Build Docker Image uses: docker/build-push-action@v6 with: - context: images - file: ${{ matrix.dockerfile }} + context: ./images + file: ./images/${{ matrix.dockerfile }} push: false - cache-from: type=registry,ref=${{ secrets.DOCKERHUB_DANDIHUB_USERNAME }}/dandihub:latest-${{ matrix.image.name }} + cache-from: type=registry,ref=${{ secrets.DOCKERHUB_DANDIHUB_USERNAME }}/dandihub:${{ matrix.tag }} cache-to: type=inline \ No newline at end of file diff --git a/addons.tf b/addons.tf index 013212b5..04a055ca 100644 --- a/addons.tf +++ b/addons.tf @@ -108,8 +108,11 @@ module "eks_blueprints_addons" { repository_username = data.aws_ecrpublic_authorization_token.token.user_name repository_password = data.aws_ecrpublic_authorization_token.token.password values = [<=3.4=mpi*' \ - && /opt/conda/envs/allen/bin/pip install --no-cache-dir allensdk \ - && conda clean --all -f -y && rm -rf /tmp/* +ENV MAMBA_NO_LOW_SPEED_LIMIT=1 RUN mamba install --yes 'datalad>=0.18' rclone 'h5py>3.3=mpi*' ipykernel zarr blosc eccodes websockify \ && wget --quiet https://raw.githubusercontent.com/DanielDent/git-annex-remote-rclone/v0.8/git-annex-remote-rclone \ && chmod +x git-annex-remote-rclone && mv git-annex-remote-rclone /opt/conda/bin \ && conda clean --all -f -y && rm -rf /tmp/* -RUN /opt/conda/envs/allen/bin/python -m ipykernel install --user --name allen \ - --display-name="Allen SDK" - RUN pip install --no-cache-dir -U plotly jupyter_bokeh jupytext nbgitpuller datalad_container \ datalad-osf dandi nibabel nilearn pybids spikeinterface neo itkwidgets \ - 'pydra>=0.17' 'pynwb>=2.3.1' 'nwbwidgets>=0.10.2' hdf5plugin s3fs h5netcdf "xarray[io]" \ + 'pydra>=0.25' 'pynwb>=2.8.3' 'nwbwidgets>=0.10.2' hdf5plugin s3fs h5netcdf "xarray[io]" \ aicsimageio kerchunk 'neuroglancer>=2.28' cloud-volume ipywidgets ome-zarr \ webio_jupyter_extension https://github.com/balbasty/dandi-io/archive/refs/heads/main.zip \ tensorstore anndata diff --git a/images/Dockerfile.allensdk b/images/Dockerfile.allensdk new file mode 100644 index 00000000..124fac19 --- /dev/null +++ b/images/Dockerfile.allensdk @@ -0,0 +1,70 @@ +FROM quay.io/jupyter/datascience-notebook:python-3.11.10 + +USER root + +RUN apt update \ + && apt install -y software-properties-common \ + && add-apt-repository -y 'ppa:apptainer/ppa' \ + && apt update \ + && apt install -y apptainer-suid \ + && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/* + +RUN apt-get update && apt-get install -y ca-certificates libseccomp2 \ + s3fs netbase less parallel tmux screen vim emacs htop curl \ + && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/* + +RUN curl --silent --show-error "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" \ + -o "awscliv2.zip" && unzip awscliv2.zip \ + && ./aws/install && rm -rf ./aws awscliv2.zip + +# Install jupyter server proxy and desktop +RUN curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg \ + && echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main"|sudo tee /etc/apt/sources.list.d/brave-browser-release.list \ + && apt-get -y -qq update \ + && apt-get -y -qq install \ + dbus-x11 \ + xfce4 \ + xfce4-panel \ + xfce4-session \ + xfce4-settings \ + xorg \ + xubuntu-icon-theme \ + brave-browser \ + tigervnc-standalone-server \ + tigervnc-xorg-extension \ + # chown $HOME to workaround that the xorg installation creates a + # /home/jovyan/.cache directory owned by root + && chown -R $NB_UID:$NB_GID $HOME \ + && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/* + +# apt-get may result in root-owned directories/files under $HOME +RUN mkdir /opt/extras && chown -R $NB_UID:$NB_GID $HOME /opt/extras + +USER $NB_USER + +RUN pip install --no-cache-dir jupyter-remote-desktop-proxy + +ENV MAMBA_NO_LOW_SPEED_LIMIT=1 + +# Install Allen SDK +RUN mamba create --yes -n allen -c conda-forge python=3.8 pip ipykernel 'h5py>=3.4=mpi*' \ + && /opt/conda/envs/allen/bin/pip install --no-cache-dir allensdk \ + && conda clean --all -f -y && rm -rf /tmp/* + +RUN mamba install --yes 'datalad>=0.18' rclone 'h5py>3.3=mpi*' ipykernel zarr blosc eccodes websockify \ + && wget --quiet https://raw.githubusercontent.com/DanielDent/git-annex-remote-rclone/v0.8/git-annex-remote-rclone \ + && chmod +x git-annex-remote-rclone && mv git-annex-remote-rclone /opt/conda/bin \ + && conda clean --all -f -y && rm -rf /tmp/* + +RUN /opt/conda/envs/allen/bin/python -m ipykernel install --user --name allen \ + --display-name="Allen SDK" + +RUN pip install --no-cache-dir -U plotly jupyter_bokeh jupytext nbgitpuller datalad_container \ + datalad-osf dandi pybids spikeinterface neo itkwidgets \ + 'pydra>=0.25' 'pynwb>=2.8.3' 'nwbwidgets>=0.10.2' hdf5plugin s3fs h5netcdf "xarray[io]" \ + aicsimageio kerchunk cloud-volume ipywidgets ome-zarr \ + webio_jupyter_extension https://github.com/balbasty/dandi-io/archive/refs/heads/main.zip \ + tensorstore anndata + +RUN pip install --no-cache-dir multiscale_spatial_image jupyterlab-git \ + datalad-fuse diff --git a/images/Dockerfile.gpu b/images/Dockerfile.gpu index 45808eb5..543fc896 100644 --- a/images/Dockerfile.gpu +++ b/images/Dockerfile.gpu @@ -1,4 +1,4 @@ -FROM quay.io/jupyter/datascience-notebook:2024-02-06 +FROM quay.io/jupyter/datascience-notebook:python-3.11.10 USER root @@ -44,27 +44,21 @@ USER $NB_USER RUN pip install --no-cache-dir jupyter-remote-desktop-proxy -# Install Allen SDK -RUN mamba create --yes -n allen -c conda-forge python=3.11 pip ipykernel 'h5py>=3.4=mpi*' \ - && /opt/conda/envs/allen/bin/pip install --no-cache-dir allensdk \ - && conda clean --all -f -y && rm -rf /tmp/* +ENV MAMBA_NO_LOW_SPEED_LIMIT=1 RUN mamba install --yes datalad rclone 'h5py>3.3=mpi*' ipykernel zarr blosc eccodes websockify \ && wget --quiet https://raw.githubusercontent.com/DanielDent/git-annex-remote-rclone/v0.8/git-annex-remote-rclone \ && chmod +x git-annex-remote-rclone && mv git-annex-remote-rclone /opt/conda/bin \ && conda clean --all -f -y && rm -rf /tmp/* -RUN /opt/conda/envs/allen/bin/python -m ipykernel install --user --name allen \ - --display-name="Allen SDK" - RUN pip install --no-cache-dir -U plotly jupyter_bokeh jupytext nbgitpuller datalad_container \ datalad-osf dandi nibabel nilearn pybids spikeinterface neo itkwidgets \ - 'pydra>=0.17' 'pynwb>=2.3.1' 'nwbwidgets>=0.10.2' hdf5plugin s3fs h5netcdf "xarray[io]" \ + 'pydra>=0.25' 'pynwb>=2.8.3' 'nwbwidgets>=0.10.2' hdf5plugin s3fs h5netcdf "xarray[io]" \ aicsimageio kerchunk 'neuroglancer>=2.28' cloud-volume ipywidgets ome-zarr \ webio_jupyter_extension https://github.com/balbasty/dandi-io/archive/refs/heads/main.zip \ tensorstore anndata && rm -rf /tmp/* -RUN mamba install --yes -c "nvidia/label/cuda-11.8.0" cuda-toolkit cudnn \ +RUN mamba install --yes -c "nvidia/label/cuda-12.6.3" cuda-toolkit cudnn \ && conda clean --all -f -y && rm -rf /tmp/* RUN pip install --no-cache-dir multiscale_spatial_image jupyterlab-git \ diff --git a/images/Dockerfile.gpu.allensdk b/images/Dockerfile.gpu.allensdk new file mode 100644 index 00000000..5a6a6365 --- /dev/null +++ b/images/Dockerfile.gpu.allensdk @@ -0,0 +1,73 @@ +FROM quay.io/jupyter/datascience-notebook:python-3.11.10 + +USER root + +RUN apt update \ + && apt install -y software-properties-common \ + && add-apt-repository -y 'ppa:apptainer/ppa' \ + && apt update \ + && apt install -y apptainer-suid \ + && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/* + +RUN apt-get update && apt-get install -y ca-certificates libseccomp2 \ + s3fs netbase less parallel tmux screen vim emacs htop curl \ + && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/* + +RUN curl --silent --show-error "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" \ + -o "awscliv2.zip" && unzip awscliv2.zip \ + && ./aws/install && rm -rf ./aws awscliv2.zip + +# Install jupyter server proxy and desktop +RUN curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg \ + && echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main"|sudo tee /etc/apt/sources.list.d/brave-browser-release.list \ + && apt-get -y -qq update \ + && apt-get -y -qq install \ + dbus-x11 \ + xfce4 \ + xfce4-panel \ + xfce4-session \ + xfce4-settings \ + xorg \ + xubuntu-icon-theme \ + brave-browser \ + tigervnc-standalone-server \ + tigervnc-xorg-extension \ + # chown $HOME to workaround that the xorg installation creates a + # /home/jovyan/.cache directory owned by root + && chown -R $NB_UID:$NB_GID $HOME \ + && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/* + +# apt-get may result in root-owned directories/files under $HOME +RUN mkdir /opt/extras && chown -R $NB_UID:$NB_GID $HOME /opt/extras + +USER $NB_USER + +RUN pip install --no-cache-dir jupyter-remote-desktop-proxy + +ENV MAMBA_NO_LOW_SPEED_LIMIT=1 + +# Install Allen SDK +RUN mamba create --yes -n allen -c conda-forge python=3.11 pip ipykernel 'h5py>=3.4=mpi*' \ + && /opt/conda/envs/allen/bin/pip install --no-cache-dir allensdk \ + && conda clean --all -f -y && rm -rf /tmp/* + +RUN mamba install --yes datalad rclone 'h5py>3.3=mpi*' ipykernel zarr blosc eccodes websockify \ + && wget --quiet https://raw.githubusercontent.com/DanielDent/git-annex-remote-rclone/v0.8/git-annex-remote-rclone \ + && chmod +x git-annex-remote-rclone && mv git-annex-remote-rclone /opt/conda/bin \ + && conda clean --all -f -y && rm -rf /tmp/* + +RUN /opt/conda/envs/allen/bin/python -m ipykernel install --user --name allen \ + --display-name="Allen SDK" + +RUN pip install --no-cache-dir -U plotly jupyter_bokeh jupytext nbgitpuller datalad_container \ + datalad-osf dandi pybids spikeinterface neo itkwidgets \ + 'pydra>=0.25' 'pynwb>=2.8.3' 'nwbwidgets>=0.10.2' hdf5plugin s3fs h5netcdf "xarray[io]" \ + aicsimageio kerchunk cloud-volume ipywidgets ome-zarr \ + webio_jupyter_extension https://github.com/balbasty/dandi-io/archive/refs/heads/main.zip \ + tensorstore anndata && rm -rf /tmp/* + +RUN mamba install --yes -c "nvidia/label/cuda-11.8.0" cuda-toolkit cudnn \ + && conda clean --all -f -y && rm -rf /tmp/* + +RUN pip install --no-cache-dir multiscale_spatial_image jupyterlab-git \ + datalad-fuse jupyterlab_nvdashboard diff --git a/images/Dockerfile.gpu.matlab b/images/Dockerfile.gpu.matlab index cd0b914c..904f23ed 100644 --- a/images/Dockerfile.gpu.matlab +++ b/images/Dockerfile.gpu.matlab @@ -55,6 +55,8 @@ USER $NB_USER RUN pip install --no-cache-dir jupyter-remote-desktop-proxy jupyterlab_nvdashboard +ENV MAMBA_NO_LOW_SPEED_LIMIT=1 + # Install CUDA toolkit and extension for GPU usage display RUN CONDA_OVERRIDE_CUDA="12.3" mamba install --yes -c "nvidia/label/cuda-12.3.0" cuda-toolkit cudnn \ && conda clean --all -f -y && rm -rf /tmp/* @@ -72,7 +74,7 @@ RUN mamba install --yes datalad rclone 'h5py>3.3=mpi*' ipykernel zarr blosc gcc RUN pip install --no-cache-dir plotly jupyter_bokeh jupytext nbgitpuller datalad_container \ datalad-osf dandi nibabel nilearn pybids spikeinterface neo \ - 'pydra>=0.17' 'pynwb>=2.3.1' 'nwbwidgets>=0.10.2' hdf5plugin s3fs h5netcdf "xarray[io]" \ + 'pydra>=0.25' 'pynwb>=2.8.3' 'nwbwidgets>=0.10.2' hdf5plugin s3fs h5netcdf "xarray[io]" \ aicsimageio kerchunk 'neuroglancer>=2.28' cloud-volume ipywidgets ome-zarr \ webio_jupyter_extension https://github.com/balbasty/dandi-io/archive/refs/heads/main.zip \ tensorstore anndata "tensorflow[and-cuda]==2.14" diff --git a/images/Dockerfile.matlab b/images/Dockerfile.matlab index bb7d7b76..efe6d522 100644 --- a/images/Dockerfile.matlab +++ b/images/Dockerfile.matlab @@ -62,8 +62,7 @@ saveProfile(cluster); \n\ % Copy the live-example folder \n\ homedirExamples = strcat(getenv('HOME'), '/example-live-scripts') \n\ if not(isfolder(homedirExamples)) \n\ - % repo = gitclone('https://github.com/MATLAB-Community-Toolboxes-at-INCF/example-live-scripts', homedirExamples, Depth=1); \n\ - repo = gitclone('https://github.com/aranega/example-live-scripts', homedirExamples, Depth=1); \n\ + repo = gitclone('https://github.com/MATLAB-Community-Toolboxes-at-INCF/example-live-scripts', homedirExamples, Depth=1); \n\ end \n\ % Add the example library to the path \n\ addpath(homedirExamples); \n\ diff --git a/images/README.adoc b/images/README.md similarity index 85% rename from images/README.adoc rename to images/README.md index 195d13f0..33029837 100644 --- a/images/README.adoc +++ b/images/README.md @@ -1,42 +1,38 @@ -:matlab_byoi: https://github.com/mathworks-ref-arch/matlab-integration-for-jupyter/tree/main/matlab - -= Dandi Docker Images +# Dandi Docker Images This folder contains Dockerfiles to build various Docker images for Dandi: * `Dockerfile` and `Dockerfile.gpu` provide Jupyter(R) notebooks for datascience. The `Dockerfile.gpu` enables the use of GPU. * `Dockerfile.matlab` provides a jupyter environment with MATLAB(R) installed. This image requires you to bring your own licence. -== MATLAB Docker Image +## MATLAB Docker Image -The MATLAB Docker image relies on the {matlab_byoi}[MATLAB Integration for Jupyter in a Docker Container] BYOI (Build Your Own Image). -It is shipped with https://github.com/mathworks/matlab-proxy[MATLAB-proxy] which enables communication with MATLAB from a web-browser, and with https://github.com/mathworks/jupyter-matlab-proxy[MATLAB-proxy-jupyter] which adds MATLAB integration for Jupyter. +The MATLAB Docker image relies on the [MATLAB Integration for Jupyter in a Docker Container](https://github.com/mathworks-ref-arch/matlab-integration-for-jupyter). +It is shipped with [MATLAB-proxy](https://github.com/mathworks/matlab-proxy) which enables communication with MATLAB from a web-browser, and with [MATLAB-proxy-jupyter](https://github.com/mathworks/jupyter-matlab-proxy) which adds MATLAB integration for Jupyter. This Dockerfile includes the following add-ons: * matnwb v2.6.0.0 * Brain-Observatory-Toolbox v0.9.2 -=== How to Build +### How to Build Building the MATLAB Docker image is straight forward. The following lines consider that you already cloned the repository and that you are positioned in the `docker` folder in the cloned repository on your file system. -[source, bash] ----- +```bash docker build -t dandi-matlab - < Dockerfile.matlab ----- +``` This will build the image tagging it as `dandi-matlab`. -=== How to Run +### How to Run Running a container for the built image requires that a port is passed to the command line to tell the container which internal port needs to be exposed and on which port to map it in the host system. -[source, bash] ----- +```bash docker run -p 8888:8888 dandi-matlab:latest ----- +``` This command considers the exposition of port `8888` and maps it to the port `8888` in the host. The syntax of the option is `-p [host port]:[container port]`. @@ -44,20 +40,19 @@ The port to expose in the container is always `8888`, but the host port can be c After the container started, you can check the logs and you will see lines giving you the address you can open in your web browser to start the Jupyter instance. -[source] ----- +``` To access the server, open this file in a browser: file:///home/jovyan/.local/share/jupyter/runtime/jpserver-6-open.html Or copy and paste one of these URLs: http://78bd0f342a19:8888/lab?token=6bf3ad4d468ab3532fab610f5ff28dcf27b1b60300ec8e0c or http://127.0.0.1:8888/lab?token=6bf3ad4d468ab3532fab610f5ff28dcf27b1b60300ec8e0c ----- +``` To open locally the Jupyter, copy/paste the `127.0.0.1:8888/xxxxx` address in your browser. CAUTION: If you changed the port on which will be mapped the internal container port, do not forget to change it also in the address you copy/paste from the logs. -=== Closing your Session +### Closing your Session Be careful while closing your session. If you don't close the session properly prior to stop your container, _i.e_: closing the MATLAB session and disconnecting yourself, there is chances that the MATLAB licencing system sees yourself as still connected and you'll have to wait the timeout of the session to be able to log/connect again after restarting the container. @@ -65,14 +60,14 @@ If you don't close the session properly prior to stop your container, _i.e_: clo To properly close your session, click on the `MATLAB Jupyter Setting` button which appears above the MATLAB top bar. From there, if you really want to close your session, clic on "Stop MATLAB Session", and if you really want to stop your Jupyter session, clic on "Sign Out". -=== Add new Add-Ons +### Add new Add-Ons By default, the `Dockerfile.matlab` image is shipped with two addons already installed and accessible from MATLAB. You can easily add/remove addons by changing some lines in the Dockerfile: the addons links to download/install are defined by the `ARG ADDONS` variable. CAUTION: The download links have to be release links towards `.zip` files. -==== How the Add-On Registration is Working +#### How the Add-On Registration is Working The add-ons registration is actually performed in two steps happening at two differents times: at "docker image construction" time, and at MATLAB startup time. @@ -82,8 +77,7 @@ At startup-time, this folder is automatically scanned by MATLAB and all download The code responsible for the auto-scan of the add-ons folder is directly injected in the `startup.m` file during the docker image construction. If some add-ons require extra actions after being installed/added to the path, you can modify these lines to add extra action before the `clear`: -[source,dockerfile] ----- +```dockerfile RUN echo -e "\n\ addons = dir('${ADDONS_DIR}'); \n\ addons = setdiff({addons([addons.isdir]).name}, {'.', '..'}); \n\ @@ -93,20 +87,20 @@ end \n\ generateCore(); % Generate the most recent nwb-schema \n\ % ADD HERE EXTRA ACTIONS FOR YOUR ADD-ON IF REQUIRED! \n\ clear" >> /opt/conda/lib/python3.10/site-packages/matlab_proxy/matlab/startup.m ----- +``` -=== Customize your Container +### Customize your Container You can customize some parameter of your container changing some variables in the `Dockerfile.matlab`. You can impact those parameters: -`ADDONS_DIR`:: +`ADDONS_DIR`: This variable defines where the add-ons must be downloaded/extracted and what will be the folder scanned by MATLAB at startup time. If you change this folder, the Jupyter user needs to have read/write access to it. This comes from a specificity of `matnwb` which requires the execution of some extra actions for its activation. -`ADDONS_RELEASE`:: +`ADDONS_RELEASE`: This variable defines the list of add-ons to download and install. You can add as much add-ons as you want as long as they are compatible with MATLAB-R22. -`ADDONS_LATEST`:: +`ADDONS_LATEST`: This variable defines the list of add-ons to download and install directly from the lastest version identified in the github repository. \ No newline at end of file diff --git a/variables.tf b/variables.tf index 44ddca84..8611943b 100644 --- a/variables.tf +++ b/variables.tf @@ -16,7 +16,7 @@ variable "region" { variable "eks_cluster_version" { description = "EKS Cluster version" - default = "1.28" + default = "1.29" type = string }