【发布时间】:2021-07-29 20:04:34
【问题描述】:
我很抱歉,因为我认为这可能是一个简单的问题,但我真的很难理解!
作为背景,我正在尝试创建一个Dockerfile,它安装了很多R CRAN 和R 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?