[英]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.