FROM rocker/shiny:4.5.2 # Install system dependencies for R packages # - libcurl4-openssl-dev, libssl-dev: for httr2/curl (ellmer dependency) # - libxml2-dev: for xml2 # - libpoppler-cpp-dev: for pdftools (PDF text and page rendering) # - libmagick++-dev: for magick (ellmer resizes images with it before sending them) # - libfontconfig1-dev, libfreetype6-dev: for magick text rendering RUN apt-get update && apt-get install -y \ libcurl4-openssl-dev \ libssl-dev \ libxml2-dev \ libpoppler-cpp-dev \ libmagick++-dev \ libfontconfig1-dev \ libfreetype6-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /code # Install remotes package first, then install specific versions of required packages. # The last line fails the build if any of them cannot be loaded. RUN R -e "install.packages('remotes', repos = 'https://cloud.r-project.org')" \ && R -e "remotes::install_version('shiny', version = '1.13.0', repos = 'https://cloud.r-project.org')" \ && R -e "remotes::install_version('jsonlite', version = '2.0.0', repos = 'https://cloud.r-project.org')" \ && R -e "remotes::install_version('ellmer', version = '0.5.0', repos = 'https://cloud.r-project.org')" \ && R -e "remotes::install_version('pdftools', version = '3.7.0', repos = 'https://cloud.r-project.org')" \ && R -e "remotes::install_version('magick', version = '2.9.1', repos = 'https://cloud.r-project.org')" \ && R -e "remotes::install_version('base64enc', version = '0.1-6', repos = 'https://cloud.r-project.org')" \ && R -e "for (p in c('shiny', 'jsonlite', 'ellmer', 'pdftools', 'magick', 'base64enc')) library(p, character.only = TRUE)" # Copy only what the app needs (tests, .env and .git are also excluded by .dockerignore) COPY app.R ./ COPY R/ ./R/ COPY config/ ./config/ COPY www/ ./www/ CMD ["R", "--quiet", "-e", "shiny::runApp(host='0.0.0.0', port=7860)"]