Skip to content

ThinkR-open/dockerfiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

db5ddac · May 21, 2025

History

95 Commits
May 3, 2025
May 21, 2025
Jun 4, 2021
May 21, 2025
Aug 7, 2024
May 7, 2025
May 21, 2025
May 21, 2025
Aug 12, 2024
Jan 28, 2022
Aug 12, 2024
Feb 4, 2018
Jan 18, 2023
May 21, 2025
Feb 4, 2018
Feb 4, 2018
Jun 28, 2024
May 21, 2025
May 21, 2025
May 21, 2025
Feb 13, 2018
Jan 18, 2023
Feb 4, 2018

Repository files navigation

R-CMD-check Coverage status

{dockerfiler}

The goal of {dockerfiler} is to provide an easy way to create Dockerfiles from R.

About

You’re reading the doc about version :

desc::desc_get_version()
#> [1] '0.2.5'

Installation

You can install dockerfiler from GitHub with:

# install.packages("remotes")
remotes::install_github("ThinkR-open/dockerfiler")

Or from CRAN with :

install.packages("dockerfiler")

Basic worflow

By default, Dockerfiles are created with FROM "rocker/r-base".

You can set another FROM in new()

library(dockerfiler)
# Create a dockerfile template
my_dock <- Dockerfile$new()
my_dock$MAINTAINER("Colin FAY", "contact@colinfay.me")

Add comments to your Dockerfile

my_dock$COMMENT("Install required R package.")

Wrap your raw R Code inside the r() function to turn it into a bash command with R -e.

my_dock$RUN(r(install.packages("attempt", repo = "http://cran.irsn.fr/")))

Classical Docker stuffs:

my_dock$COMMENT("Copy Plumber API and main script to container.")
my_dock$RUN("mkdir /usr/scripts")
my_dock$RUN("cd /usr/scripts")
my_dock$COPY("plumberfile.R", "/usr/scripts/plumber.R")
my_dock$COPY("torun.R", "/usr/scripts/torun.R")
my_dock$COMMENT("Expose the API port and run the main script when the container starts.")
my_dock$EXPOSE(8000)
my_dock$CMD("Rscript /usr/scripts/torun.R ")

See your Dockerfile :

my_dock

If you’ve made a mistake in your script, you can switch lines with the switch_cmd method. This function takes as arguments the positions of the two cmd you want to switch :

# Switch line 8 and 7
my_dock$switch_cmd(8, 7)
my_dock

You can also remove a cmd with remove_cmd:

my_dock$remove_cmd(8)
my_dock

This also works with a vector:

my_dock$remove_cmd(5:7)
my_dock

add_after add a command after a given line.

my_dock$add_after(
  cmd = "RUN R -e 'remotes::install_cran(\"rlang\")'",
  after = 3
)

Save your Dockerfile:

my_dock$write()

Multi-stage dockerfile

Here is an example of generating a multi-stage Dockerfile directly from R: we create two Dockerfile objects, one for the build stage (builder) and one for the final stage (final), and then merge them into a single file.

stage_1 <- Dockerfile$new(
  FROM = "alpine",AS ="builder"
)
stage_1$RUN('echo "Hi from builder" > /coucou.txt')

stage_2 <- Dockerfile$new(
  FROM = "ubuntu", AS = "final"
)
stage_2$COMMENT("copy /coucou.txt from builder to /truc.txt in final")
stage_2$COPY(from = "/coucou",to = "/truc.txt",force = TRUE, stage ="builder")
stage_2$RUN( "cat /truc.txt")

stage_1$write()
stage_2$write(append = TRUE)
#file.edit("Dockerfile")

Create a Dockerfile from a DESCRIPTION

You can use a DESCRIPTION file to create a Dockerfile that installs the dependencies and the package.

my_dock <- dock_from_desc("DESCRIPTION")
my_dock

my_dock$CMD(r(library(dockerfiler)))

my_dock$add_after(
  cmd = "RUN R -e 'remotes::install_cran(\"rlang\")'",
  after = 3
)
my_dock

Create a Dockerfile from renv.lock

  • Create renv.lock
dir_build <- tempfile(pattern = "renv")
dir.create(dir_build)

# Create a lockfile
the_lockfile <- file.path(dir_build, "renv.lock")
custom_packages <- c(
  # attachment::att_from_description(),
  "renv",
  "cli",
  "glue",
  "golem",
  "shiny",
  "stats",
  "utils",
  "testthat",
  "knitr"
)
renv::snapshot(
  packages = custom_packages,
  lockfile = the_lockfile,
  prompt = FALSE
)
  • Build Dockerfile
my_dock <- dock_from_renv(
  lockfile = the_lockfile,
  distro = "focal",
  FROM = "rocker/verse"
)
my_dock

Contact

Questions and feedbacks welcome!

You want to contribute ? Open a PR :) If you encounter a bug or want to suggest an enhancement, please open an issue.

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.