FROM rocker/shiny:latest WORKDIR /code # Install system dependencies in a single layer RUN apt-get update && apt-get install -y \ libmagick++-dev \ imagemagick \ libcurl4-openssl-dev \ libssl-dev \ libfontconfig1-dev \ libfreetype6-dev \ libharfbuzz-dev \ libfribidi-dev \ libxml2-dev \ libcairo2-dev \ libxt-dev \ fonts-roboto \ cmake \ && rm -rf /var/lib/apt/lists/* # Set CRAN mirror once RUN echo 'options(repos = c(CRAN = "https://cloud.r-project.org"))' > ~/.Rprofile # Install core R packages first (split into smaller groups) RUN R -e 'install.packages(c("remotes", "curl", "httr", "jsonlite", "bslib"))' RUN R -e 'install.packages(c("ggplot2", "dplyr", "grid", "gridExtra", "gtable"))' RUN R -e 'install.packages(c("patchwork", "readr"))' # Install magick separately RUN R -e 'install.packages("magick")' # Install showtext RUN R -e 'install.packages("showtext")' # Install arrow last with optimized settings ENV ARROW_R_DEV=TRUE ENV NOT_CRAN=TRUE # Try binary first, fall back to minimal build RUN R -e 'tryCatch(install.packages("arrow", INSTALL_opts = "--no-test-load"), \ error = function(e) { \ Sys.setenv(LIBARROW_MINIMAL="true"); \ Sys.setenv(ARROW_WITH_ZLIB="OFF"); \ Sys.setenv(ARROW_WITH_ZSTD="OFF"); \ Sys.setenv(ARROW_WITH_LZ4="OFF"); \ Sys.setenv(ARROW_WITH_SNAPPY="OFF"); \ Sys.setenv(ARROW_WITH_BROTLI="OFF"); \ Sys.setenv(ARROW_WITH_PARQUET="ON"); \ install.packages("arrow", INSTALL_opts = "--no-test-load") \ })' # Copy app files COPY . . # Expose port EXPOSE 7860 # Run app CMD ["R", "--quiet", "-e", "shiny::runApp(host='0.0.0.0', port=7860)"]