簡體   English   中英

當R包安裝返回錯誤時,讓Docker映像構建失敗

[英]Let Docker image build fail when R package installation returns error

我正在嘗試使用Dockerfile創建基於Rocker的自定義Docker鏡像。 在Dockerfile中,我使用以下命令從自定義GitLab服務器中提取自己的R包:

RUN R -e "devtools::install_git('[custom gitlab server]', quiet = FALSE)"

一切通常都有效,但我注意到當GitLab服務器關閉或運行Docker的機器內存不足時,程序包無法正確安裝並在R控制台中返回錯誤消息。 這種行為是可以預期的。 但是,Docker沒有注意到R產生的錯誤,並繼續評估Dockerfile的其余部分。 當發生這種情況時,我希望Docker無法構建映像。 這樣,我最終可以阻止Kubernetes自動部署不完整的Docker容器。

到目前為止,我已經想到了兩個可能的解決方案,但我正在努力執行:

  1. R級 :圍繞devtools::install_git包裝tryCatch()以捕獲錯誤。 但那又怎樣? 使用stop 這會導致Docker構建過程停止嗎? 可以使用withCallingHandlers()嗎?
  2. Dockerfile級別 :使用shell命令檢查錯誤? 我找不到R --help的內容,因為我目前沒有Linux機器。 所以我不確定R -e實際上做了什么(執行我推測)以及哪些其他命令可以與R一起傳遞。

似乎在這里這里討論了類似的問題,但我不明白他們是如何解決它的。

那么如何在沒有自定義包的情況下確保沒有Docker鏡像最終在Kubernetes集群上運行?

一旦Dockerfile一個命令返回非零狀態,Docker構建過程就應該停止。

如果未成功安裝軟件包, install_git似乎不會拋出錯誤,因此執行會繼續。

一個顯而易見的方法是將安裝包裝在專用的R腳本中,如果沒有成功完成則拋出錯誤,然后停止構建。

所以我會建議像這樣......

創建安裝腳本install_gitlab.R

### file install_gitlab.R

## change repo- and package name!!

repo <- '[custom gitlab server]'

pkgname <- 'testpackage'

devtools::install_git(repo, quiet = FALSE)

stopifnot(pkgname %in% installed.packages()[,'Package'])

相應地修改Dockerfile (替換install_git行):

...

Add install_gitlab.R /runscripts/install_gitlab.R

RUN Rscript /runscripts/install_gitlab.R

...

有一點要記住的是,這種方法假定你正在試圖安裝之前調用命令安裝該軟件包。

如果您使用的是搖桿的形象,他們已經擁有的littler安裝的軟件包,它具有方便的installGithub.r腳本。 我相信它應該已經擁有你想要的功能。 如果沒有,它至少簡化了自定義install_github.r腳本的運行。

使用littler的docker RUN命令看起來像:

RUN installGithub.r "yourRepo"

暫無
暫無

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

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