可以是一个docker层“绕过”构build?

让我们来看看我有一个像这样的Dockerfile:

FROM debian:stretch RUN apt update RUN apt install -y wget RUN wget https://stackoverflow.com/ # I know the wget is useless. Is just an example :) CMD ["echo", "hello-world"] 

我想把这个新的RUN语句放在wget语句上。 在这个改变之后,当我重build的时候,它会把我修改的所有命令重新运行到down,所以wget会再次执行。 问题是wget命令花了很多时间来完成,因为在我的真实文件中,文件是一个非常大的文件。

问题是,可以将docker“调整”到某处以避免再次构buildwget层的执行? 如果我已经build立了它,那么即使改变它的声明,该层可以再次使用吗?

谢谢。

AFAIK这是不可能的,因为docker工人只是重复使用层,直到你的变化,并开始从那里再次build立。

这是因为新的图层在先前构build的图层上进行了testing(因此,您的RUN wget图层已经过testing,并且构build在从FROMRUN apt install -y wget的图层上,以便RUN apt install -y wget )。 因此,如果您在RUN wget指令之上input另一个RUN指令,则会为RUN wget指令获取更改后的环境,因此需要重新执行。

我不认为有一种手动的方式,它会重用在“不同”的环境中build立的图层,我也不会推荐它。

在运行docker run时使用docker-compose或者-v标志,你可以挂载一个在运行之间持续存在的卷。 将您的wget更改为有条件地在没有该文件的情况下运行的脚本。

这将不caching后,但会更快。

您可能需要修改存储该文件的文件夹,具体取决于脚本的其余部分以及您的环境是如何设置的。

我正在使用撰写卷安装在这里: https : //github.com/jaydorsey/ghgvcR/blob/master/docker-compose.yml

查看该仓库中的bin / download-files.sh文件。