Skip to content

Commit ecd03a1

Browse files
committed
Document dk_from_*() functions
Disable running to avoid needing to set an environment variable for `pak` to operate.
1 parent 56884e1 commit ecd03a1

10 files changed

+466
-144
lines changed

R/dockitect-from-environment.R

Lines changed: 189 additions & 115 deletions
Large diffs are not rendered by default.

R/utils.R

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,86 @@ generate_pkg_install_cmd <- function(package_manager, packages) {
235235
)
236236
}
237237
)
238-
}
238+
}
239+
240+
241+
242+
#' Add system requirements for R packages to a `dockerfile`
243+
#'
244+
#' Identifies and adds the necessary system requirements for R packages
245+
#' to a `dockerfile` using the `pak` package to determine dependencies.
246+
#'
247+
#' @param dockerfile A `dockerfile` object
248+
#' @param packages Character vector of package names
249+
#' @param package_manager Package manager to use (default: `"auto"`)
250+
#'
251+
#' @return
252+
#' An updated `dockerfile` object with system requirements added
253+
#'
254+
#' @examples
255+
#' \dontrun{
256+
#' # Create a dockerfile
257+
#' df <- dockerfile() |>
258+
#' dfi_from("rocker/r-ver:4.4.0")
259+
#'
260+
#' # Add system requirements for packages
261+
#' df <- dk_add_sysreqs(df, c("xml2", "RPostgreSQL", "rJava"))
262+
#' }
263+
#'
264+
#' @details
265+
#' This function uses the pak package to determine the system requirements
266+
#' for the specified R packages. It then formats the appropriate installation
267+
#' commands for the detected package manager and adds them as `RUN` instructions
268+
#' to the `dockerfile`.
269+
#'
270+
#' The `pak` package must be installed for this function to work.
271+
#'
272+
#' @seealso
273+
#' [generate_pkg_install_cmd()] for generating package installation commands &
274+
#' [determine_package_manager()] for determining the package manager
275+
#'
276+
#' @family utility functions
277+
#' @export
278+
dk_add_sysreqs <- function(dockerfile, packages, package_manager = "auto") {
279+
check_dockerfile(dockerfile)
280+
281+
if (package_manager == "auto") {
282+
package_manager <- dockerfile$metadata$package_manager
283+
if (is.null(package_manager)) {
284+
package_manager <- "apt"
285+
cli::cli_warn("Could not determine package manager. Defaulting to apt.")
286+
}
287+
}
288+
289+
# Get system requirements using pak
290+
if (!requireNamespace("pak", quietly = TRUE)) {
291+
cli::cli_warn("Package 'pak' is required to determine system requirements. Skipping.")
292+
return(dockerfile)
293+
}
294+
295+
# Map package manager to appropriate sysreqs platform
296+
os <- determine_linux_distribution(dockerfile$metadata$base_image)
297+
platform <- map_to_sysreqs_platform(package_manager, os)
298+
299+
# Get system requirements data frame
300+
sysreqs_df <- pak::pkg_sysreqs(packages, sysreqs_platform = platform)
301+
302+
if (is.null(sysreqs_df$packages) || nrow(sysreqs_df$packages) == 0) {
303+
return(dockerfile)
304+
}
305+
306+
# Extract system packages from the data frame and remove duplicates
307+
system_packages <- unique(unlist(sysreqs_df$packages$system_packages))
308+
309+
if (length(system_packages) == 0) {
310+
return(dockerfile)
311+
}
312+
313+
# Generate system-specific install commands using utility function
314+
install_cmd <- generate_pkg_install_cmd(package_manager, system_packages)
315+
316+
# Add the installation command
317+
dockerfile <- dfi_run(dockerfile, paste(install_cmd, collapse = " && "))
318+
319+
dockerfile
320+
}

man/determine_linux_distribution.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/determine_package_manager.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/dk_add_sysreqs.Rd

Lines changed: 36 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/dk_from_description.Rd

Lines changed: 36 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/dk_from_renv.Rd

Lines changed: 39 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/dk_from_script.Rd

Lines changed: 40 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)