更快地构建Docker映像

时间:2020-05-21 22:42:02

标签: r docker containers

我计划使用一项服务来接收我下学期将要教授的课程的学生代码并为其评分。

对于每个分配(有很多),将运行一个shell脚本来构建Docker映像。我将一个zip文件上传到网站,在所有压缩文件中,有一个:

#!/usr/bin/env bash

# these lines install R on the  virtual machine
apt-get install -y libxml2-dev libcurl4-openssl-dev libssl-dev
apt-get install -y r-base

# these lines install the packages that is needed both
# 1. the student code 
# 2. the autograding code

# Note that 
# a. devtools is for install_github This is temporary and will be changed once the updates to gradeR have made it to CRAN.
Rscript -e "install.packages('devtools')" 
Rscript -e "library(devtools); install_github('tbrown122387/gradeR')"

# These are packages that many students in the class will use
Rscript -e "install.packages('tidyverse')" 
Rscript -e "install.packages('stringr')" 

问题是,这大约需要20分钟。我如何加快速度?我是Docker容器的新手。

2 个答案:

答案 0 :(得分:3)

使用来自Docker Hub的rocker/tidyverse映像,而不要使用您使用的任何映像。

第一:

docker pull rocker/tidyverse

然后添加此行:

FROM rocker/verse

答案 1 :(得分:3)

首先,我建议您构建一个基础映像,其中包含您认为需要的所有工具和软件包。无需挑剔,因为您只需要这样做一次。这就是Docker的重点-可移植性和重用性。

FROM ubuntu:bionic

RUN apt-get update && apt-get install -y libxml2-dev libcurl4-openssl-dev libssl-dev r-base

RUN Rscript -e "install.packages('tidyverse')" 
RUN Rscript -e "install.packages('stringr')" 
...

构建该图像并将其标记为grader:1.0.0或其他标记。

然后,当需要评分时,只需使用-v, --volume选项的docker run挂载作业和评分代码。您无需更改容器即可在其中访问文件。

docker run \
  --rm \
  -it \
  -v /path/to/assignments:/data/assignments \
  -v /path/to/autograder:/data/autograder \
  grader:1.0.0 \
  /bin/bash

如果需要添加某些软件包,则可以通过修改原始Dockerfile对其进行重建,也可以通过将其用作下一个映像的基础来对其进行扩展:

FROM grader:1.0.0

RUN apt-get update && apt-get install -y the-package-i-forgot

构建它,对其进行标记。