# syntax=docker/dockerfile:1 FROM rocker/r2u:22.04 WORKDIR /code ARG DEBIAN_FRONTEND=noninteractive # ============================================================================== # System dependencies # ============================================================================== RUN apt-get update -y && apt-get install -y --no-install-recommends \ wget bzip2 git unzip ca-certificates locales tzdata \ build-essential gfortran \ libcurl4-openssl-dev libssl-dev libxml2-dev libgit2-dev \ libopenblas-dev liblapack-dev \ python3 python3-pip \ && rm -rf /var/lib/apt/lists/* ENV LC_ALL=C.UTF-8 LANG=C.UTF-8 HF_HUB_DISABLE_TELEMETRY=1 # ============================================================================== # Python packages # ============================================================================== RUN pip3 install --no-cache-dir pandas earthengine-api # ============================================================================== # Install R packages (prioritize apt when available for speed) # ============================================================================== ARG APT_R_PKGS="\ r-cran-shiny r-cran-dplyr r-cran-dt \ r-cran-data.table r-cran-foreach r-cran-doparallel" RUN set -eux; \ apt-get update -y; \ for pkg in $APT_R_PKGS; do \ if apt-cache show "$pkg" >/dev/null 2>&1; then \ echo "Installing $pkg via apt ..."; \ apt-get install -y --no-install-recommends "$pkg" || true; \ fi; \ done; \ rm -rf /var/lib/apt/lists/* # ============================================================================== # R packages via CRAN (fallback for those not in apt) # ============================================================================== RUN Rscript - <<'RSCRIPT' options(Ncpus = parallel::detectCores()) cran <- "https://cloud.r-project.org" req <- c( "shiny", "dplyr", "DT", "data.table", "bslib", "shinyWidgets", "xgboost", "reticulate", "future", "future.apply" ) installed <- rownames(installed.packages()) need <- setdiff(req, installed) if (length(need)) { if (!requireNamespace("pak", quietly = TRUE)) { install.packages("pak", repos = "https://r-lib.github.io/p/pak/stable") } ok <- tryCatch({ pak::pak(need) TRUE }, error = function(e) FALSE) if (!ok) install.packages(need, repos = cran) } RSCRIPT # ============================================================================== # Copy application files # ============================================================================== COPY . /code/ # ============================================================================== # Shiny entrypoint # ============================================================================== EXPOSE 7860 CMD ["R", "--quiet", "-e", "port <- as.integer(Sys.getenv('PORT', '7860')); shiny::runApp('/code', host='0.0.0.0', port=port)"]