|
1 | | -# Base image |
2 | | -FROM rocker/verse:latest |
| 1 | +# Fast, sane base with R + tools |
| 2 | +FROM rocker/verse:4.5 |
3 | 3 |
|
4 | | -# Set environment variables so renv/pip use them |
5 | | -ENV R_CACHE=/root/.cache/R/ |
6 | | -ENV RENV_CACHE=/root/.cache/R/renv/ |
7 | | -ENV PIP_CACHE=/root/.cache/pip |
8 | | - |
9 | | -# Install Python |
10 | | -RUN apt-get update && apt-get install -y \ |
11 | | - python3 python3-pip python3-venv python3-dev\ |
12 | | - && rm -rf /var/lib/apt/lists/* |
13 | | - |
14 | | -# Install system dependencies |
15 | | -RUN apt-get update && apt-get upgrade -y && \ |
16 | | - apt-get install -y --no-install-recommends \ |
17 | | - make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \ |
18 | | - libsqlite3-dev curl libncursesw5-dev xz-utils tk-dev libxml2-dev \ |
19 | | - libxmlsec1-dev libffi-dev liblzma-dev \ |
| 4 | +ENV DEBIAN_FRONTEND=noninteractive |
| 5 | +# Default cache locations (can be overridden at runtime) |
| 6 | +ENV RENV_PATHS_CACHE=/root/.local/share/renv \ |
| 7 | + PIP_CACHE_DIR=/root/.cache/pip |
| 8 | + |
| 9 | +# --- Layer 1: OS deps (cacheable) |
| 10 | +RUN --mount=type=cache,target=/var/cache/apt \ |
| 11 | + --mount=type=cache,target=/var/lib/apt \ |
| 12 | + apt-get update && apt-get install -y --no-install-recommends \ |
| 13 | + python3 python3-pip python3-venv python3-dev \ |
| 14 | + libcurl4-openssl-dev libssl-dev libxml2-dev \ |
20 | 15 | libtesseract-dev libpoppler-cpp-dev tesseract-ocr \ |
21 | | - libleptonica-dev libpng-dev libjpeg-dev libtiff-dev imagemagick \ |
22 | | - gdal-bin libgdal-dev libsecret-1-dev \ |
23 | | - default-jdk openjdk-11-jdk \ |
| 16 | + libleptonica-dev libpng-dev libjpeg-dev libtiff-dev \ |
| 17 | + imagemagick gdal-bin libgdal-dev libsecret-1-dev \ |
24 | 18 | libglpk-dev libudunits2-dev \ |
25 | | - gnupg software-properties-common |
| 19 | + curl gnupg ca-certificates \ |
| 20 | + && rm -rf /var/lib/apt/lists/* |
26 | 21 |
|
27 | | -# Install GitHub CLI |
28 | | -RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | \ |
29 | | - dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \ |
| 22 | +# --- Layer 2: GitHub CLI (optional) |
| 23 | +RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \ |
| 24 | + | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \ |
30 | 25 | chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && \ |
31 | 26 | echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \ |
32 | 27 | > /etc/apt/sources.list.d/github-cli.list && \ |
33 | 28 | apt-get update && apt-get install -y gh && \ |
34 | 29 | rm -rf /var/lib/apt/lists/* |
35 | 30 |
|
36 | | -# Install Quarto CLI separately |
37 | | -RUN curl -fsSL https://quarto.org/download/latest/quarto-linux-amd64.deb -o quarto.deb && \ |
38 | | - apt-get update && apt-get install -y ./quarto.deb && \ |
39 | | - rm quarto.deb |
40 | | - |
41 | | -# Environment variables |
42 | | -ENV JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/" |
43 | | -ENV PATH=/root/.pyenv/bin:$PATH |
44 | | -ENV VENV_PATH="/root/.virtualenvs/venv" |
45 | | -ENV REQ_FILE="/project/setup/requirements.txt" |
46 | | -ENV DEBIAN_FRONTEND=noninteractive |
47 | | - |
48 | | -# Make sure these exist |
49 | | -# RUN mkdir -p ${RENV_CACHE} ${PIP_CACHE} |
50 | | - |
51 | | -# Install tinytex system-wide (for LaTeX support) |
52 | | -RUN --mount=type=cache,target=${R_CACHE} Rscript -e "install.packages('tinytex'); tinytex::install_tinytex(force=T)" |
53 | | - |
54 | | -# Install minimal R packages for system-level support |
55 | | -RUN --mount=type=cache,target=${R_CACHE} Rscript -e "install.packages(c('digest','devtools','renv','reticulate','yaml'))" |
| 31 | +# --- Layer 3: Quarto |
| 32 | +RUN curl -fsSL https://quarto.org/download/latest/quarto-linux-amd64.deb -o /tmp/quarto.deb && \ |
| 33 | + apt-get update && apt-get install -y /tmp/quarto.deb && rm -f /tmp/quarto.deb && \ |
| 34 | + rm -rf /var/lib/apt/lists/* |
56 | 35 |
|
57 | | -# Copy renv.lock and renv directory for layer caching, install R dependencies via renv |
58 | | -COPY renv.lock /project/renv.lock |
59 | | -COPY renv /project/renv |
| 36 | +# --- Layer 4: TinyTeX (LaTeX) |
| 37 | +RUN Rscript -e "install.packages('tinytex', repos='https://cloud.r-project.org'); tinytex::install_tinytex()" |
60 | 38 |
|
61 | | -# Restore R deps from renv.lock using persistent cache |
62 | | -RUN --mount=type=cache,target=${R_CACHE} Rscript -e 'renv::restore(lockfile = "/project/renv.lock", prompt = FALSE)' |
| 39 | +# Optional: a couple of helper R packages used during checks |
| 40 | +RUN Rscript -e "install.packages(c('digest'), repos='https://cloud.r-project.org')" |
63 | 41 |
|
64 | | -# Copy Python requirements file if exists (cached separately) |
65 | | -COPY setup/requirements.txt ${REQ_FILE} |
66 | | -RUN --mount=type=cache,target=${PIP_CACHE} python3 -m venv /root/.virtualenvs/venv && \ |
67 | | - "${VENV_PATH}/bin/pip" install --cache-dir "${PIP_CACHE}" -r "${REQ_FILE}" |
| 42 | +# Ensure cache dirs always exist (first-run safe) |
| 43 | +RUN mkdir -p ${RENV_PATHS_CACHE} ${PIP_CACHE_DIR} /root/.virtualenvs |
68 | 44 |
|
69 | | -# Copy the rest of the project |
70 | | -COPY . /project |
71 | 45 | WORKDIR /project |
72 | 46 |
|
73 | | -# Verify Environment |
74 | | -RUN Rscript -e "renv::status();renv::diagnostics();devtools::session_info();reticulate::py_config()" |
75 | | - |
76 | | -# Default command |
77 | | -CMD ["/bin/sh", "-c", "quarto render && quarto publish"] |
| 47 | +# Default command: render then publish |
| 48 | +CMD ["/bin/sh","-c","quarto render && quarto publish"] |
0 commit comments