Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当Docker程序包安装返回错误时,让Docker映像生成失败_R_Docker_Kubernetes_Dockerfile - Fatal编程技术网

当Docker程序包安装返回错误时,让Docker映像生成失败

当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

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

运行R-e“devtools::install_git('[custom gitlab server]',quiet=FALSE)”

一切正常,但我注意到,当GitLab服务器关闭,或者运行Docker的机器内存不足时,软件包无法正确安装,并在R控制台中返回错误消息。这种行为是意料之中的。但是,Docker没有注意到Docker产生的错误,而是继续评估Docker文件的其余部分。我希望Docker在出现这种情况时无法构建映像。这样,我最终可以阻止Kubernetes自动部署不完整的Docker容器

到目前为止,我已经想到了两种可能的解决方案,但我正在努力执行:

  • R level:围绕
    devtools::install\u git
    捕获错误。那又怎么样?使用
    停止
    ?这是否也会导致Docker构建过程停止?是否可以使用
    withCallingHandlers()
  • Dockerfile级别:是否使用shell命令检查错误?我找不到
    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的docker
    RUN
    命令如下所示:


    运行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
    
    ...