![](/img/trans.png)
[英]Python package installation issue when docker build based on r-base docker image
[英]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容器。
到目前為止,我已經想到了兩個可能的解決方案,但我正在努力執行:
devtools::install_git
包裝tryCatch()
以捕獲錯誤。 但那又怎樣? 使用stop
? 這會導致Docker構建過程停止嗎? 可以使用withCallingHandlers()
嗎? 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.