【问题标题】:Can be a docker layer "bypassed" on build?可以在构建时“绕过” docker 层吗?
【发布时间】:2017-10-25 11:21:48
【问题描述】:

假设我有一个像这样的 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 语句。在这个改变之后,当我重建时,它会重新运行从我修改到 down 的所有命令,所以 wget 将再次被执行。问题是 wget 命令需要很长时间才能完成,因为在我的真实文件中,该文件是一个非常大的文件。

问题是,是否可以在某处对 docker 进行“调整”以避免再次构建 wget 层的执行?如果我已经构建了它,是否可以再次使用该层,甚至更改其上的语句?

谢谢。

【问题讨论】:

    标签: image docker dockerfile layer tweak


    【解决方案1】:

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

    这是因为新层在先前构建的层上进行了测试(因此您的 RUN wget 层经过测试并构建在从 FROMRUN apt install -y wget 的层上)。因此,如果您在RUN wget 指令上方输入另一条RUN 指令,您的RUN wget 指令的环境将发生变化,因此需要再次执行。

    我认为没有办法手动处理它,因此它会重用构建在“不同”环境中的层,我也不推荐它。

    【讨论】:

      【解决方案2】:

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

      这不会缓存后者,但会使该步骤更快。

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

      我在这里使用 compose 进行卷挂载:https://github.com/jaydorsey/ghgvcR/blob/master/docker-compose.yml

      查看该 repo 中的 bin/download-files.sh 文件以获取 bash 示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-06
        • 1970-01-01
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多