【问题标题】:Tell Docker build to ignore change of order of RUN commands告诉 Docker 构建忽略 RUN 命令顺序的更改
【发布时间】:2020-05-07 07:29:41
【问题描述】:

假设我们有这个:

RUN go get 'github.com/foo/one'
RUN go get 'github.com/foo/two'
RUN go get 'github.com/foo/three'

我们改变顺序:

RUN go get 'github.com/foo/two'
RUN go get 'github.com/foo/three'
RUN go get 'github.com/foo/one'

缓存将完全失效。有没有办法告诉docker build 依赖的顺序无关紧要。像这样的一些语法:

PARALLEL START
RUN go get 'github.com/foo/two'
RUN go get 'github.com/foo/three'
RUN go get 'github.com/foo/one'
PARALLEL END

【问题讨论】:

  • 如果您担心这一点,我想这是因为您有几个不同的构建脚本可以执行相同的操作。您最好重新排列这些构建脚本以保持一致。您可能会考虑重构它们以提取公共部分;例如,您可能希望为所有图像提供一致的基础图像。

标签: docker dockerfile docker-build docker-layer


【解决方案1】:

这是不可能的,因为构建图像时图层系统的工作方式。

图像是通过在现有内容之上添加内容来构建的,因此,如果您更改顺序,就会改变结构,从而构建不同的图像。

不是缓存“失效”,而是根本没有缓存。从 docker 的角度来看,它们是完全不同的图像。

【讨论】:

  • 我确信在垃圾回收发生之前 docker 层仍然在 fs 上,所以我认为 invalidated 是正确的词。
  • @MrCholo 我想你不明白我的意思。当然层在 fs 上,但正如我所说,如果你改变顺序,那些层是完全不同的。在 Docker 中,因素的顺序确实会改变产品
  • 当然,但问题是是否有办法制作独立的图层。我在之前的评论中说的是,这些层没有被删除,这些层仍然存在于 fs 上,只是创建了新层,而新的构建中没有使用旧层。似乎可以创建独立的层,其中的顺序无关紧要。
【解决方案2】:

Docker 使用分层架构来制作镜像。假设您的文件包含以下命令:command 1 command 2 command 3

docker 会执行命令 1 并创建一个 layer1 并在该层之上执行其他命令以分别添加第 2 层和第 3 层。您需要了解这一点,通过使用此模式 docker 使用了缓存过程。如果您更改命令顺序,它将从您更改顺序的位置重新创建图层。

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2011-01-18
    • 2023-03-20
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多