
py-rocket-geospatial-2 is a Python–R geospatial Docker image for large-scale earth-science data analysis in JupyterHub environments.
It is designed for users working with large earth-observation datasets, especially cloud-native data, from organizations such as NOAA, NASA, and other public earth-science data providers. The image targets workflows common in cryoscience, oceanography, climate science, and remote sensing. It is optimized for:
The image also includes Quarto, TeX Live, MyST, and JupyterBook for scientific publishing.
notebook, activated on startupThe image is designed to be used in JupyterHubs and you can use in your hub yaml with ghcr.io/nmfs-opensci/container-images/py-rocket-geospatial-2:latest but best practice is to pin to a specific tag.
You can also run on a computer with Docker installed with
docker pull ghcr.io/nmfs-opensci/container-images/py-rocket-geospatial-2:latest
docker run -it --rm -p 8888:8888 ghcr.io/nmfs-opensci/container-images/py-rocket-geospatial-2:latest
Base infrastructure (Jupyter, Dask, Python install, conda setup, R install, and user-experience configuration) lives in
py-rocket-base
py-rocket-geospatial-2 adds:
See the py-rocket-base documentation for base image design details.
This repository automatically maintains pinned and validated package lists:
reproducibility/packages-python-pinned.yamlreproducibility/packages-r-pinned.Rreproducibility/build.logPinned versions are extracted directly from the built image and validated against the requested package lists to support reproducibility and debugging.
The repository uses a streamlined CI/CD workflow that ensures quality before publishing Docker images:
Workflow: Build → Test → Push → Create Release PR (all in one job)
The main build-test-push job executes:
Design: The Docker image (~7GB compressed) stays in the build runner’s local Docker cache, avoiding artifact transfer overhead. Only small artifacts (test results, validation reports) are uploaded with 7-day retention.
You can manually trigger the workflow with options:
skip_tests: true
.github/workflows/build-and-push.yml - Main workflow (build, test, push, release).github/workflows/test-python.yml - Manual test trigger for existing images.github/workflows/pin-packages.yml - Manual package validation for existing imagesThe workflow automatically runs when changes are pushed to main affecting:
.github/actions/build-and-push/action.yml.github/workflows/build-and-push.ymlDockerfileconda-env/env-*.ymlinstall.Rapt.txtDesktop/**conda-env/env-*.ymlinstall.RDockerfileIf changes affect core platform behavior, please open an issue in py-rocket-base
FROM ghcr.io/nmfs-opensci/container-images/py-rocket-geospatial-2:2026.02.08
USER root
COPY . /tmp/
RUN /pyrocket_scripts/install-conda-packages.sh /tmp/your-environment.yml || echo "install-conda-packages.sh failed" || true
RUN /pyrocket_scripts/install-r-packages.sh /tmp/install.R || echo "install-r-package.sh failed" || true
RUN rm -rf /tmp/*
USER ${NB_USER}
WORKDIR ${HOME}
You can use the https://github.com/nmfs-opensci/py-rocket-geospatial-2/Dockerfile as a template.
Making your derivative image build automatically in GitHub from your repo.
.github/actions/build-and-push/action.yml to the same location in your repo.github/workflows/build-and-push.yml into your repo and edit the image-name.This image was originally maintained under
https://github.com/nmfs-opensci/container-images
It now lives in its own dedicated repository as part of the NMFS OpenSci container ecosystem.