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

Vic*_*ria 5 r docker kubernetes dockerfile

我正在尝试使用 Dockerfile 创建基于 Rocker 的自定义 Docker 映像。在 Dockerfile 中,我使用以下命令从自定义 GitLab 服务器中提取自己的 R 包:

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

通常一切正常,但我注意到,当 GitLab 服务器关闭或运行 Docker 的计算机 RAM 内存不足时,该包无法正确安装并在 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.

似乎这里这里讨论了类似的问题,但我不明白他们是如何解决的。

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

Val*_*Val 4

一旦其中一个命令返回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'])
Run Code Online (Sandbox Code Playgroud)

相应地修改您的Dockerfile(替换install_git行):

...

Add install_gitlab.R /runscripts/install_gitlab.R

RUN Rscript /runscripts/install_gitlab.R

...
Run Code Online (Sandbox Code Playgroud)

要记住的一件事是,此方法假设您尝试安装的包在调用命令之前未安装。