❝接「R」R Docker 教程❞
前面我们学习了一个可以在 Docker 中运行 RStudio 的基础镜像,学习如何使用 docker commit
修改镜像的内容。这是一个非常棒的技术,它让我们可以进行重复,但如果我们想要更简单地修改镜像中的内容,并有一份清晰的记录,该怎么办呢?这就是 Dockerfile 的用武之地了。
FROM rocker/verse:latest
这告诉 Docker 以 rocker/verse
基础镜像作为开始。FROM
命令必须是第一条指令。
接下来,让我们基于该基础镜像添加一层,让 gapminder
提取安装好可以直接使用:
RUN R -e "install.packages('gapminder', repos = 'http://cran.us.r-project.org')"
RUN
命令可以执行 Shell 命令,这个例子中,我们直接通过 Shell 调用包安装命令。保存你的 Dockerfile,返回终端,现在我们可以利用下面的命令构建一个自定义镜像:
docker build -t my-r-image .
-t my-r-image
指定镜像名字(要小写),.
指定构建镜像所需要的资源来源,这里指当前目录。查看镜像:
docker images
现在你可以运行你的镜像:
docker run --rm -p 8787:8787 my-r-image
在 RStudio 控制台中尝试运行:
library('gapminder')
gapminder
现在该包已经是直接可以使用了!
有时候我们想要添加一些静态文件到镜像中,这可以使用 ADD
命令:
ADD data/gapminder-FiveYearData.csv /home/rstudio/
在构建和重构建你的 Docker 镜像时,你可能注意到了类似下面的输出:
Step 2 : RUN R -e "install.packages('gapminder', repos = 'http://cran.us.r-project.org')"
---> Using cache
---> fa9be67b52d1
注意到使用的是命令的缓存版本。当你重新构建映像时,Docker 会检查该映像的以前版本,以查看以前是否执行了相同的命令;每一个步骤都被保存为一个单独的层,Docker 非常聪明,可以重用那些层,如果它们没有改变,并且和前面一样的顺序。因此,一旦你弄清楚了你的安装过程的一部分(特别是如果它是一个缓慢的部分),把它放在你的Dockerfile的顶部,不要在这些行上面或中间放任何东西,特别是那些经常变化的东西;这可以大大加快你的构建过程。
❝简单的说,重构建只修改有变动的步骤,如果很多命令没有问题,尽量放到顶部。 ❞
本节,我们学习了如何组合一个 Dockerfile 用于按我们自己的想法构建镜像,包括 3 个命令:
FROM
指定基础镜像RUN
运行命令ADD
添加文件使用 docker build -t my-r-image .
构建。
❝小抄:
❞
既然我们已经学会了如何利用 Dockerfile,我们就能够将我们所有的分析发给合作者。我们将分享一个包含运行我们分析的所有依赖的镜像。
我们通过 Dockerfile 构建该镜像。让我们还是以之前使用过的 rocker 镜像开始。这一次我们使用指定的 R 版本,通过这里[1]查看所有可获取的镜像列表。版本标签在可重复性分析中非常有用。
FROM rocker/verse:3.3.2
作为分析的一部分,我们将使用 gapminder 数据集,添加下面的内容:
RUN R -e "install.packages('gapminder', repos = 'http://cran.us.r-project.org')"
接下来将我们的分析写成脚本并将其添加到 Dockerfile 中。
library(ggplot2)
library(gapminder)
life_expentancy_plot <- ggplot(data = gapminder) +
geom_point(aes(x = lifeExp, y = gdpPercap, colour = continent))
将其添加到 Docker 镜像中的指定目录中:
ADD analysis.R /home/rstudio/
现在我们可以构建这个镜像然后检查是否我们已经具备分享的一些内容:
docker build -t my-analysis .
查看我们的分析镜像:
docker images
启动镜像:
docker run -dp 8787:8787 my-analysis
太好了,我们的分析脚本在里面,而且数据包也已经安装好了。
现在将分析推送到 dockerhub。
创建仓库后,使用下面的命令进行登录。
docker login --username=yourhubusername --email=youremail@company.com
检查镜像 ID:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-analysis latest dc63d4790eaa 2 minutes ago 3.164 GB
给要提交的镜像打标签:
docker tag dc63d4790eaa yourhubusername/gapminder_my_analysis:firsttry
推送到你创建好的仓库:
docker push yourhubusername/gapminder_my_analysis
现在你的镜像任何人都可以使用了。
合作者通过下面的命令可以下载它:
docker pull yourhubusername/gapminder_my_analysis:firsttry
更多资料:
[1]这里: https://hub.docker.com/r/rocker/verse/tags/