当Docker程序包安装返回错误时,让Docker映像生成失败
我正在尝试使用Dockerfile创建一个基于Rocker的自定义Docker图像。在Dockerfile中,我使用以下方法从自定义GitLab服务器中提取自己的R包:当Docker程序包安装返回错误时,让Docker映像生成失败,r,docker,kubernetes,dockerfile,R,Docker,Kubernetes,Dockerfile,我正在尝试使用Dockerfile创建一个基于Rocker的自定义Docker图像。在Dockerfile中,我使用以下方法从自定义GitLab服务器中提取自己的R包: 运行R-e“devtools::install_git('[custom gitlab server]',quiet=FALSE)” 一切正常,但我注意到,当GitLab服务器关闭,或者运行Docker的机器内存不足时,软件包无法正确安装,并在R控制台中返回错误消息。这种行为是意料之中的。但是,Docker没有注意到Docker
运行R-e“devtools::install_git('[custom gitlab server]',quiet=FALSE)”
一切正常,但我注意到,当GitLab服务器关闭,或者运行Docker的机器内存不足时,软件包无法正确安装,并在R控制台中返回错误消息。这种行为是意料之中的。但是,Docker没有注意到Docker产生的错误,而是继续评估Docker文件的其余部分。我希望Docker在出现这种情况时无法构建映像。这样,我最终可以阻止Kubernetes自动部署不完整的Docker容器
到目前为止,我已经想到了两种可能的解决方案,但我正在努力执行:
devtools::install\u git
捕获错误。那又怎么样?使用停止
?这是否也会导致Docker构建过程停止?是否可以使用withCallingHandlers()
R--help
的内容,因为我目前没有Linux机器。因此,我不确定R-e
实际上做了什么(我猜是执行的),以及哪些其他命令可以随R
一起传递因此,如何确保在没有自定义包的情况下,没有Docker映像在Kubernetes群集上运行?Docker文件中的一个命令返回非零状态后,Docker构建过程应停止
install\u git
在包未成功安装时似乎不会抛出错误,因此执行会继续
一个明显的方法是将安装包装在一个专用的R
脚本中,如果没有成功完成,则抛出一个错误,然后停止构建
所以我会建议像这样的事情
创建安装脚本安装\u 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'])
需要记住的一点是,这种方法假设在调用命令之前,您尝试安装的软件包不是安装的。如果您使用的是rocker映像,那么他们已经安装了
littler
软件包,该软件包包含方便的installGithub.r
脚本。我相信它应该已经具备了你想要的功能。如果没有,它至少简化了自定义install\u github.r
脚本的运行
使用littler的dockerRUN
命令如下所示:
运行installGithub.r“yourRepo”
您收到的错误消息是什么?@Val这是由于RAM内存太少而由r控制台返回的错误消息:*正在安装*源*包“[包名]”…**R错误:无法分配大小为1.3 Gb的向量错误:无法为包“[package name]”构建sysdata DB*删除“/usr/local/lib/R/site library/[package name]”安装失败:命令失败(1)
没有帮助?
...
Add install_gitlab.R /runscripts/install_gitlab.R
RUN Rscript /runscripts/install_gitlab.R
...