![](/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.