繁体   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