Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 可以是docker层“;绕过;在建?_Image_Docker_Dockerfile_Layer_Tweak - Fatal编程技术网

Image 可以是docker层“;绕过;在建?

Image 可以是docker层“;绕过;在建?,image,docker,dockerfile,layer,tweak,Image,Docker,Dockerfile,Layer,Tweak,让我们假设我有这样一个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"] 我想在wget语句上加上一个新的RUN语句。在这个更改之后,当我重建时,它将重新运行从修改到关闭

让我们假设我有这样一个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"]
我想在wget语句上加上一个新的RUN语句。在这个更改之后,当我重建时,它将重新运行从修改到关闭的所有命令,因此wget将再次执行。问题是wget命令需要花费很多时间才能完成,因为在我的真实文件中,该文件是一个非常大的文件

问题是,docker是否可以在某个地方进行“调整”,以避免再次构建wget层的执行?如果我已经构建了它,那么即使在上面更改了一条语句,该层也可以再次使用吗


谢谢。

AFAIK这是不可能的,因为docker只会重复使用图层,直到您进行更改,然后从那里开始重新构建

这是因为新层将在以前构建的层上进行测试(因此您的
运行wget
层将在
运行apt安装-y wget
的层上进行测试和构建)。因此,如果在
RUN wget
指令上方输入另一条
RUN
指令,则
RUN wget
指令的环境会发生变化,因此需要再次执行该指令


我不认为有办法手动处理它,这样它就可以重用在“不同”环境中构建的层,我也不推荐它。

使用docker compose,或者在运行
docker run时使用-v标志
可以装载一个在两次运行之间保持的卷。将wget更改为在没有文件的情况下有条件运行的脚本

这不会缓存后面的数据,但会加快这一步

根据脚本的其余部分以及环境的设置方式,您可能需要修改存储该文件的文件夹

我在这里使用compose进行卷装载:

查看该repo中的bin/download-files.sh文件,了解bash示例