当R包安装返回错误时,让Docker映像构建失败

时间:2018-03-06 11:00:25

标签: r docker kubernetes dockerfile

我正在尝试使用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级:在tryCatch()周围包裹devtools::install_git以捕获错误。但那又怎样?使用stop?这会导致Docker构建过程停止吗?可以使用withCallingHandlers()吗?
  2. Dockerfile级别:使用shell命令检查错误?我找不到R --help的内容,因为我目前没有Linux机器。所以我不确定R -e实际上做了什么(执行我推测)以及哪些其他命令可以与R一起传递。
  3. 似乎讨论了类似的问题herehere,但我不明白他们是如何解决的。

    那么如何在没有自定义包的情况下确保没有Docker镜像最终在Kubernetes集群上运行?

2 个答案:

答案 0 :(得分:2)

一旦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

...

要记住的一件事是,这种方法假定您在调用命令之前安装的软件包 NOT

答案 1 :(得分:0)

如果您正在使用摇杆图片,则他们已经安装了littler软件包,该软件包具有方便的installGithub.r脚本。我相信它应该已经拥有你想要的功能。如果没有,它至少简化了自定义install_github.r脚本的运行。

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

RUN installGithub.r "yourRepo"