前言
近期遇到有部分 R Script 執行時佔用太多 VM 記憶體,所以打算把 R 打包成一個 Docker image,讓他可以在 GCP Cloud Run 上面跑,解放 VM 的資源。
首先我建立了一個基於 tidyverse 的 Dockerfile,安裝常用的兩個套件,並讓這個 image 可以由外部提供一個 JOB_NAME 參數,來動態指定要執行的檔案。
(選擇 tidyverse 的原因是使用 r-base 時會遇到無法安裝 bigrquery 的問題)
FROM rocker/tidyverse:4.4.1
RUN R -e "install.packages(c('dplyr', 'bigrquery'), repos='<http://cran.rstudio.com/>')"
COPY r_jobs /r_jobs
CMD ["sh", "-c", "Rscript /r_jobs/$JOB_NAME"]
建立 Docker image 時遇到的瓶頸
雖然這個 image 是可以正常執行,但 docker build 後發現兩個大問題:
- Docker image 太胖!
- image 竟然有 2.5 GB 這麼大,這將會造成部署與存放上的問題。
- R 套件安裝太慢!
- 光是安裝兩個套件的步驟,就要花 5 分鐘,安裝 12 個套件需要 20 分鐘(如下圖 1,203 秒),時間成本太高。

基於這兩個問題我開始研究 Docker image 的優化方法。
閱讀更多»
