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 容器。
到目前为止,我已经想到了两种可能的解决方案,但我在执行方面遇到了困难:
tryCatch()以devtools::install_git捕获错误。但然后呢?使用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'])
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)
要记住的一件事是,此方法假设您尝试安装的包在调用命令之前未安装。
| 归档时间: |
|
| 查看次数: |
1585 次 |
| 最近记录: |