【问题标题】:Importing R CRAN, Bioconductor and github R packages in one Dockerfile在一个 Dockerfile 中导入 R CRAN、Bioconductor 和 github R 包
【发布时间】:2021-07-29 20:04:34
【问题描述】:

我很抱歉,因为我认为这可能是一个简单的问题,但我真的很难理解!

作为背景,我正在尝试创建一个Dockerfile,它安装了很多R CRANR Bioconductor 包以及来自Github 的一些R 包。我想尽快完成此操作,因此我使用rocker 的基本映像来安装二进制文件,请参阅此处以获取出色的快速教程:https://datawookie.dev/blog/2019/01/docker-images-for-r-r-base-versus-r-apt/

我的方法是首先将所有必需的软件包安装为二进制文件,如果没有可用的软件包,请从源代码安装它们。之后,我使用Bioconductor 基础镜像安装必要的Bioconductor 包。

但是,我通过rocker 基本映像安装的软件包在我导入Bioconductor 基本映像后不可用。这就是我觉得我对创建 Dockerfile 没有清晰理解的地方,但我似乎无法在任何文档中找到答案。导入另一个图像后有什么方法可以复制这些吗?不知道有没有必要,我看到其他人也是这样的,比如这里的问题海报:Minimizing the size of docker image R shiny app

需要注意的是,我导入了Bioconductor 基本映像,因为我认为这将有助于处理依赖问题。我想我可以只安装 Bioconductor 软件包,比如 R 软件包,这些软件包不能作为二进制文件提供,但我想尽可能快和干净地完成此操作,我认为这会减慢速度。

基本上,我想知道在一个 dockerfile 中安装 R 二进制文件、R 非二进制文件、R bioconductor 和 github 包的最快方法是什么。

下面是我的方法的一个示例,其中包含我需要的一小部分包。请注意,我已经展示了我安装 R 二进制文件、R 非二进制文件、R bioconductor 和 github 包的完整方法,但是对于这个问题,我看到了在导入 Bioconductor 图像之前和之后 tidyverse R 包会发生什么情况;调用 library(tidyverse) 之前运行但之后失败:

Dockerfile

## Use r-ubuntu, prev r-apt:bionic to enable the use of binary r packages for speed for R 4.0
FROM rocker/r-ubuntu:18.04

## Install available binaries - for speed
RUN apt-get update && \
    apt-get install -y -qq \
r-cran-tidyverse \
r-cran-ids \
r-cran-snow

## Install remaining packages from source
COPY ./requirements-src.R .
RUN Rscript requirements-src.R

## This works
RUN R -e 'library(tidyverse)'

## Install Bioconductor packages
# Docker inheritance
FROM bioconductor/bioconductor_docker:RELEASE_3_12
COPY ./requirements-bioc.R .
#Don't bother running for speed but this will run
#RUN R -e 'BiocManager::install(ask = F)' && Rscript requirements-bioc.R

#This will fail - can't find the package
RUN R -e 'library(tidyverse)'

## Install from GH the following
#Don't bother running for speed but this will run
#RUN installGithub.r mojaveazure/loomR 


EXPOSE 8787

## Make R the default
CMD [”R”]

requirements-src.R

pkgs <- c(
'spelling',
'english',
'DT'
)

install.packages(pkgs)

requirements-bioc.R

bioc_pkgs<-c(
'biomaRt',
'DropletUtils',
'rhdf5'
)

BiocManager::install(bioc_pkgs,ask=F)

【问题讨论】:

  • 虽然我同意不应该浪费时间,但您是否真的需要减少图像创建时间?除非你每天都这样做,否则我希望让它运行良好并始终如一地胜过尝试在包编译时间上节俭。
  • 不过,附带的问题是,第一个 (rocker) 容器中的库路径是否被第二个 (Bioconductor) 中的目录所掩盖?
  • 映像创建时间是一个问题,因为之前的映像需要数小时才能构建,而 docker hub 有 2 小时的构建限制,因此每次都必须手动构建(实际用例有很多要安装的软件包)-这是我要避免的!关于附带问题,我其实不知道。
  • 好的,现在说得通了(我不在 docker hub 上构建,所以从来没有遇到过构建时间限制)。第二,尝试在别处显式创建一个包库目录,安装到 it 中,然后在覆盖 Bioconductor 基础映像后查看它是否仍然可用。
  • 这是我对 Docker 缺乏广泛知识的阻碍,我原则上理解这种方法以及为什么它应该有效,但我以前没有做过类似的事情。您可能不知道,但这种方法是否仍可用于 github 操作以在推送时构建 docker?

标签: r docker


【解决方案1】:

为了其他遇到类似问题的人的利益,我将发布我的解决方案。我并不是说这是唯一的解决方案,所以如果其他人找到更好的选择,我会更新它。

最后,我创建 docker 镜像的方法是:

  1. 使用最新的Rocker RStudio image - 将软件包安装为二进制文件,并使用正确的依赖项轻松调试软件包,因为您可以交互式运行映像
  2. 从最新的 Bioconductor image 安装所有库 - 以确保您可以安装任何 Bioconductor 软件包而不会出现问题
  3. 安装 CRAN 二进制文件
  4. 从源代码安装 CRAN 包 - 二进制文件不可用的地方
  5. 安装 Bioconductor 软件包
  6. 安装 Github 包

我的解决方案按此顺序使用此步骤,并且应该证明是一种快速有效的解决方案(我的用例是一个 R 包,它需要来自 CRAN、Bioconductor 和 Github 的 >80 个其他包作为依赖项!这个解决方案减少了运行时间为原件的一小部分)。此外,由于我们使用的是最新版本的 Rocker RStudio 和软件包,因此应该与最新版本的软件和软件包保持同步。

Dockerfile 如下所示:

#LABEL maintainer="John Doe"

## Use rstudio installs binaries from RStudio's RSPM service by default,
## Uses the latest stable ubuntu, R and Bioconductor versions
FROM rocker/rstudio


## Add packages dependencies - from Bioconductor
RUN apt-get update \
        && apt-get install -y --no-install-recommends apt-utils \
        && apt-get install -y --no-install-recommends \
        ## Basic deps
        gdb \
        libxml2-dev \
        python3-pip \
        libz-dev \
        liblzma-dev \
        libbz2-dev \
        libpng-dev \
        libgit2-dev \
        ## sys deps from bioc_full
        pkg-config \
        fortran77-compiler \
        byacc \
        automake \
        curl \
        ## This section installs libraries
        libpcre2-dev \
        libnetcdf-dev \
        libhdf5-serial-dev \
        libfftw3-dev \
        libopenbabel-dev \
        libopenmpi-dev \
        libxt-dev \
        libudunits2-dev \
        libgeos-dev \
        libproj-dev \
        libcairo2-dev \
        libtiff5-dev \
        libreadline-dev \
        libgsl0-dev \
        libgslcblas0 \
        libgtk2.0-dev \
        libgl1-mesa-dev \
        libglu1-mesa-dev \
        libgmp3-dev \
        libhdf5-dev \
        libncurses-dev \
        libbz2-dev \
        libxpm-dev \
        liblapack-dev \
        libv8-dev \
        libgtkmm-2.4-dev \
        libmpfr-dev \
        libmodule-build-perl \
        libapparmor-dev \
        libprotoc-dev \
        librdf0-dev \
        libmagick++-dev \
        libsasl2-dev \
        libpoppler-cpp-dev \
        libprotobuf-dev \
        libpq-dev \
        libperl-dev \
        ## software - perl extensions and modules
        libarchive-extract-perl \
        libfile-copy-recursive-perl \
        libcgi-pm-perl \
        libdbi-perl \
        libdbd-mysql-perl \
        libxml-simple-perl \
        libmysqlclient-dev \
        default-libmysqlclient-dev \
        libgdal-dev \
        ## new libs
        libglpk-dev \
        ## Databases and other software
        sqlite \
        openmpi-bin \
        mpi-default-bin \
        openmpi-common \
        openmpi-doc \
        tcl8.6-dev \
        tk-dev \
        default-jdk \
        imagemagick \
        tabix \
        ggobi \
        graphviz \
        protobuf-compiler \
        jags \
        ## Additional resources
        xfonts-100dpi \
        xfonts-75dpi \
        biber \
        libsbml5-dev \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*

#install R CRAN binary packages
RUN install2.r -e \
testthat

## Install remaining packages from source
COPY ./requirements-src.R .
RUN Rscript requirements-src.R

## Install Bioconductor packages
COPY ./requirements-bioc.R .
RUN apt-get update \
 && apt-get install -y --no-install-recommends \
   libfftw3-dev \
   gcc && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
RUN Rscript -e 'requireNamespace("BiocManager"); BiocManager::install(ask=F);' \
&& Rscript requirements-bioc.R

## Install from GH the following
RUN installGithub.r theislab/kBET \
chris-mcginnis-ucsf/DoubletFinder \

请注意,来自源的 CRAN 包和 Bioconductor 包分别保存在与 Dockerfile 相同的文件夹中的不同脚本中。

requirements-src.R:

pkgs <- c(
'spelling',
'english',
'Seurat')

install.packages(pkgs)

要求-bioc.R:

bioc_pkgs<-c(
'biomaRt',
'SingleCellExperiment',
'SummarizedExperiment')

requireNamespace("BiocManager")
BiocManager::install(bioc_pkgs,ask=F)

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2013-11-04
    • 2020-09-08
    • 2020-11-24
    相关资源
    最近更新 更多