我正在尝试使用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容器。
到目前为止,我已经想到了两个可能的解决方案,但我正在努力执行:
答案 0 :(得分:2)
一旦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
...
要记住的一件事是,这种方法假定您在调用命令之前安装的软件包 NOT 。
答案 1 :(得分:0)
如果您正在使用摇杆图片,则他们已经安装了littler
软件包,该软件包具有方便的installGithub.r
脚本。我相信它应该已经拥有你想要的功能。如果没有,它至少简化了自定义install_github.r
脚本的运行。
使用littler的docker RUN
命令看起来像:
RUN installGithub.r "yourRepo"