这听起来很愚蠢,但是听着:
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
ENV RUST_VERSION=1.82.0
RUN asdf install rust ${RUST_VERSION} && \
asdf global rust ${RUST_VERSION} && \
asdf reshim rust ${RUST_VERSION}
而且,如果你问我,解决方案绝对不是阶段性的。我不知道这里应该采取什么方法,但我有一种强烈的感觉,这不是阶段,它会让一切变得更加复杂,有 30 多个阶段。
谢谢你。
不是一般意义上的,因为包管理器倾向于维护在文件中跟踪的状态,而用完全不同的状态替换这些状态是不好的。结果将是多次安装依赖项或跳过依赖项的安装(假设它已经安装)。
可以将 Dockerfile 设计为多阶段构建,但您需要将应用程序安装在可以在阶段之间轻松复制的位置。如果应用程序安装在各种公共目录中,则在阶段之间执行复制将变得复杂且脆弱。
通常,此问题表明您没有围绕运行应用程序的最小环境来设计映像。在尝试破解问题的解决方案之前,请尝试重新设计图像以不需要解决问题。