我可以不按顺序缓存 Dockerfile 层吗?

问题描述 投票:0回答:1

这听起来很愚蠢,但是听着:

ENV PYTHON3_VERSION=3.12.7
RUN asdf install python ${PYTHON3_VERSION} && \
  asdf global python ${PYTHON3_VERSION} && \
  asdf reshim python ${PYTHON3_VERSION}

ENV PYTHON2_VERSION=2.7.17
RUN asdf install python ${PYTHON2_VERSION} && \
  asdf global python ${PYTHON2_VERSION} && \
  asdf reshim python ${PYTHON2_VERSION}

ENV GOLANG_VERSION=1.23.2
RUN asdf install golang ${GOLANG_VERSION} && \
  asdf global golang ${GOLANG_VERSION} && \
  asdf reshim golang ${GOLANG_VERSION}

ENV RUST_VERSION=1.82.0
RUN asdf install rust ${RUST_VERSION} && \
  asdf global rust ${RUST_VERSION} && \
  asdf reshim rust ${RUST_VERSION}

我有一个像这样的 Dockerfile,还有 30 个

asdf install global reshim

版本可能会更改为任何内容,因为我会不时更改次要版本,问题是 Docker 会按顺序缓存层。如果

RUST_VERSION
改变了,那么
go py3 py2
就不会被重新编译,就可以了。但如果
PYTHON3_VERSION
发生变化,那么
py2 go rust
将再次重新编译,尽管没有任何改变。我想像块一样非顺序缓存。

  • 我:我需要改变
    PYTHON3_VERSION
  • docker:好的,请稍等一下
  • docker:嗯,这个块没有任何变化,所以我不应该重新运行这个块
ENV RUST_VERSION=1.82.0
RUN asdf install rust ${RUST_VERSION} && \
  asdf global rust ${RUST_VERSION} && \
  asdf reshim rust ${RUST_VERSION}

而且,如果你问我,解决方案绝对不是阶段性的。我不知道这里应该采取什么方法,但我有一种强烈的感觉,这不是阶段,它会让一切变得更加复杂,有 30 多个阶段。

谢谢你。

docker
1个回答
0
投票

不是一般意义上的,因为包管理器倾向于维护在文件中跟踪的状态,而用完全不同的状态替换这些状态是不好的。结果将是多次安装依赖项或跳过依赖项的安装(假设它已经安装)。

可以将 Dockerfile 设计为多阶段构建,但您需要将应用程序安装在可以在阶段之间轻松复制的位置。如果应用程序安装在各种公共目录中,则在阶段之间执行复制将变得复杂且脆弱。

通常,此问题表明您没有围绕运行应用程序的最小环境来设计映像。在尝试破解问题的解决方案之前,请尝试重新设计图像以不需要解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.