Dockerfiles 中行延续的好处

Kir*_*-CO 2 docker

我最近一直在与 Docker 合作来托管一个 RStudio 服务器实例。有许多软件包需要安装,在 Dockerfile 中执行此操作的一种方法是(显然还有更多行):

RUN Rscript -e "install.packages('beanplot')"
RUN Rscript -e "install.packages('beeswarm')"
RUN Rscript -e "install.packages('boot')"
RUN Rscript -e "install.packages('caTools')"
Run Code Online (Sandbox Code Playgroud)

我看到很多这样的例子:

RUN Rscript -e "install.packages(c('beanplot','beeswarm','boot','caTools'))
Run Code Online (Sandbox Code Playgroud)

此外,我经常看到像这样链接在一起的各种可执行行:

RUN yum -y update \
 && yum -y groupinstall 'Development Tools' \
 && yum -y install epel-release \
                   vim \
                   initscripts \
                   libpng-devel \
                   mesa-libGL \
                   mesa-libGL-devel \
                   mesa-libGLU \
                   mesa-libGLU-devel \
                   ypbind \
                   rpcbind \
                   authconfig \
 && yum -y install R \  
 && mkdir /rhome
Run Code Online (Sandbox Code Playgroud)

而不是将 is && 行作为单独的 RUN 行。

我原以为这样做的好处是减小了 docker 镜像的大小,但是当我测试一个大示例时,两种方法都会产生相同的大小。

链接命令而不是每一行都有单独的 RUN 命令有什么好处?

axi*_*iac 5

每个RUN命令都会向图像添加一个新层,并且允许的层数有上限(大约 255 左右)。出于性能原因强制执行此限制。

每次运行在容器内的应用程序需要访问文件时,引擎都会在所有这些层中搜索文件,从上到下,直到找到它。如果应用程序尝试更改不在最顶层的文件,则引擎首先在最顶层制作文件的副本,然后将应用程序的写入请求处理到副本上。

最顶层是可写的。它不存储在图像中,但它是容器的一部分。存储在图像中的图层是只读的。

这一切都在文档中进行了解释。建议保留少量层作为最佳实践