簡體   English   中英

如何加快 docker 中 R 包的安裝

[英]How to speed up R packages installation in docker

假設您有以下要為 docker 映像安裝的軟件包列表

("jsonlite","dplyr","stringr","tidyr","lubridate",
"knitr","purrr","tm","cba","caret",
"plumber","httr")

安裝這些實際上需要大約 1 小時!

關於如何加快這種事情的任何建議? (或者如何防止在每個新映像構建時重新安裝?)

邊注

我不會像這樣從 dockerfile 安裝這些包:

RUN Rscript -e "install.packages('stringr')
...

相反,我創建了一個 R 腳本Requirements.R來安裝這些軟件包,然后簡單地執行以下操作:

RUN Rscript Requirements.R

這些是不是比直接從 Dockerfile 安裝包更不理想?

盡可能使用二進制包,就像我們在Rocker 項目中經常做的那樣,為 R 提供多個 Docker 文件,包括官方的 r-base 文件。

如果你從 Ubuntu 開始,你會得到超過 3000 多個包的Michael 的 PPA 如果你從 Debian 開始,你從發行版中得到的更少,但仍然有很多必不可少的。 (有一些努力為 Debian 帶來更多二進制包,但目前還沒有任何進展。)

最后,Dockerfile 創建當然也是編譯時間。 您花一次時間(每個容器創建)並在之后多次重復使用。 此外,通過使用 Docker Hub,您可以避免消耗本地 CPU 周期。

2020 年 9 月編輯 :(更新的)Ubuntu PPA現在為三個最新的 LTS 版本提供了超過 4600 個軟件包。 還是很不錯的,強烈推薦。

我找到了一篇文章,描述了如何從預編譯的二進制文件中安裝 R 包。 它將我們 Jenkins 服務器上的構建時間從 45 分鍾減少到 3 分鍾。

這是我的Dockerfile

FROM rocker/r-apt:bionic
WORKDIR /app
RUN apt-get update && \
  apt-get install -y libxml2-dev

# Install binaries (see https://datawookie.netlify.com/blog/2019/01/docker-images-for-r-r-base-versus-r-apt/)
COPY ./requirements-bin.txt .
RUN cat requirements-bin.txt | xargs apt-get install -y -qq

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

# Clean up package registry
RUN rm -rf /var/lib/apt/lists/*

COPY ./src /app

EXPOSE 5000
CMD ["Rscript", "Server.R"]

您可以使用包名稱添加文件requirements-bin.txt

r-cran-plumber
r-cran-quanteda
r-cran-irlba
r-cran-lsa
r-cran-caret
r-cran-stringr
r-cran-dplyr
r-cran-magrittr
r-cran-randomforest

最后,對於不能作為二進制requirements-src.R提供的包的requirements-src.R src.R:

pkgs <- c(
    'otherpackage'
)

install.packages(pkgs)

我最終按照@DirkEddelbuettel 的建議使用了搖桿/r-base。 還要感謝這個如何在為 Python 項目構建 Docker 鏡像時避免重新安裝包? 我以每次重建 docker 映像時都不會重新安裝軟件包的方式編寫 Dockerfile。

我想分享我的 Dockerfile 現在的樣子,希望這對其他人有幫助:

FROM rocker/r-base

RUN apt-get update

# install packages 
RUN apt-get -y install libcurl4-openssl-dev
RUN apt-get -y install libssl-dev

# set work directory 
WORKDIR /myapp

# copy requirments R script
COPY ./Requirements.R /myapp/Requirements.R

# run requirments R script
RUN Rscript Requirements.R

COPY . /myapp

EXPOSE 8094

ENV NAME R-test-service

CMD ["Rscript", "my_R_api.R"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM