|
| 1 | +# =========================================================================== |
| 2 | +# Stage 1: Dependencies (cached layer -- only rebuilds when DESCRIPTION changes) |
| 3 | +# =========================================================================== |
| 4 | +FROM rocker/r-ver:4.4.2 AS deps |
| 5 | + |
| 6 | +# Headless rgl (no X11 display in Docker) |
| 7 | +ENV RGL_USE_NULL=TRUE |
| 8 | + |
| 9 | +# System libraries needed by R packages |
| 10 | +RUN apt-get update && apt-get install -y --no-install-recommends \ |
| 11 | + build-essential \ |
| 12 | + libcurl4-openssl-dev \ |
| 13 | + libssl-dev \ |
| 14 | + libxml2-dev \ |
| 15 | + libmagick++-dev \ |
| 16 | + librsvg2-dev \ |
| 17 | + libpng-dev \ |
| 18 | + libgl1-mesa-dev \ |
| 19 | + libglu1-mesa-dev \ |
| 20 | + libfreetype6-dev \ |
| 21 | + libharfbuzz-dev \ |
| 22 | + libfribidi-dev \ |
| 23 | + libfontconfig1-dev \ |
| 24 | + libtiff5-dev \ |
| 25 | + libjpeg-dev \ |
| 26 | + libwebp-dev \ |
| 27 | + zlib1g-dev \ |
| 28 | + git \ |
| 29 | + && rm -rf /var/lib/apt/lists/* |
| 30 | + |
| 31 | +# Copy only dependency-defining file for cache optimization |
| 32 | +COPY DESCRIPTION /tmp/pkg/DESCRIPTION |
| 33 | + |
| 34 | +# Install all R packages (PPM binaries where available) |
| 35 | +RUN Rscript -e " \ |
| 36 | + install.packages('remotes', repos='https://cloud.r-project.org'); \ |
| 37 | + # Imports \ |
| 38 | + install.packages(c('Rcpp', 'ggplot2', 'ggfx', 'viridis', 'config', 'cli', 'rlang'), \ |
| 39 | + repos='https://cloud.r-project.org'); \ |
| 40 | + # Shiny runtime dependencies \ |
| 41 | + install.packages(c('shiny', 'bslib', 'bsicons', 'shinyjs', 'colourpicker', 'waiter', \ |
| 42 | + 'rsvg', 'magick', 'zip', 'scales', 'ambient', 'png', 'base64enc', \ |
| 43 | + 'deldir', 'snic', 'ggforce', 'data.table'), \ |
| 44 | + repos='https://cloud.r-project.org'); \ |
| 45 | + # GitHub-only packages \ |
| 46 | + remotes::install_github('stla/RCDT'); \ |
| 47 | +" |
| 48 | + |
| 49 | +# =========================================================================== |
| 50 | +# Stage 2: Application (fast rebuild on code changes) |
| 51 | +# =========================================================================== |
| 52 | +FROM deps AS app |
| 53 | + |
| 54 | +# Create app user (HF Spaces runs as uid 1000) |
| 55 | +RUN useradd -m -u 1000 appuser |
| 56 | + |
| 57 | +# Copy package source and install (compiles Rcpp C++) |
| 58 | +COPY . /tmp/jigsawR-src |
| 59 | +RUN cd /tmp/jigsawR-src && \ |
| 60 | + R CMD INSTALL --no-test-load . && \ |
| 61 | + rm -rf /tmp/jigsawR-src |
| 62 | + |
| 63 | +# Set up the Shiny app directory |
| 64 | +RUN mkdir -p /app/output |
| 65 | +COPY inst/shiny-app/ /app/ |
| 66 | +COPY inst/config.yml /app/config.yml |
| 67 | + |
| 68 | +RUN chown -R appuser:appuser /app |
| 69 | + |
| 70 | +USER appuser |
| 71 | +WORKDIR /app |
| 72 | + |
| 73 | +EXPOSE 7860 |
| 74 | + |
| 75 | +CMD ["Rscript", "-e", "shiny::runApp('/app', host='0.0.0.0', port=7860, launch.browser=FALSE)"] |
0 commit comments