docker - 在 Dockerfile 中使用 env 和 arg 会导致缓存层无效

标签 docker dockerfile

为什么要缓存层RUN命令无效?

FROM python:3.7-slim
ARG VERSION
RUN pip install --upgrade pip && pip install -r requirements.txt
ENV VERSION_2 2
ENV VERSION $VERSION
CMD ["env"]

如上面的dockerfile所示,使用build arg动态设置环境变量会导致RUN的缓存层指令变得无效,因为build-arg每次构建都会改变,镜像的历史如下

IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
13d8c1c91aed   2 minutes ago   CMD ["env"]                                     0B        buildkit.dockerfile.v0
<missing>      2 minutes ago   ENV VERSION=1                                   0B        buildkit.dockerfile.v0
<missing>      2 minutes ago   ENV VERSION_2=2                                 0B        buildkit.dockerfile.v0
<missing>      2 minutes ago   RUN |1 VERSION=1 /bin/sh -c pip install --up…   5.28MB    buildkit.dockerfile.v0
<missing>      2 minutes ago   ARG VERSION                                     0B        buildkit.dockerfile.v0
<missing>      7 days ago      /bin/sh -c #(nop)  CMD ["python3"]              0B        
<missing>      7 days ago      /bin/sh -c set -ex;   savedAptMark="$(apt-ma…   8.49MB    
<missing>      7 days ago      /bin/sh -c #(nop)  ENV PYTHON_GET_PIP_SHA256…   0B        
<missing>      7 days ago      /bin/sh -c #(nop)  ENV PYTHON_GET_PIP_URL=ht…   0B        
<missing>      7 days ago      /bin/sh -c #(nop)  ENV PYTHON_PIP_VERSION=20…   0B        
<missing>      7 days ago      /bin/sh -c cd /usr/local/bin  && ln -s idle3…   32B       
<missing>      7 days ago      /bin/sh -c set -ex   && savedAptMark="$(apt-…   27.1MB    
<missing>      7 days ago      /bin/sh -c #(nop)  ENV PYTHON_VERSION=3.7.9     0B        
<missing>      7 days ago      /bin/sh -c #(nop)  ENV GPG_KEY=0D96DF4D4110E…   0B        
<missing>      7 days ago      /bin/sh -c set -eux;  apt-get update;  apt-g…   7.03MB    
<missing>      8 days ago      /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B        
<missing>      8 days ago      /bin/sh -c #(nop)  ENV PATH=/usr/local/bin:/…   0B        
<missing>      8 days ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      8 days ago      /bin/sh -c #(nop) ADD file:422aca8901ae3d869…   69.2MB

最佳答案

docker 文档有明确的解释,好吧,我粗心了。

https://docs.docker.com/engine/reference/builder/#impact-on-build-caching

关于docker - 在 Dockerfile 中使用 env 和 arg 会导致缓存层无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65813457/

相关文章:

javascript - docker生产代码构建

bash - 如何在 Dockerfile 中启动 ssh-agent

go - 从 Go 代码构建 Docker 镜像

linux - 将环境 docker 变量导出到文件

kubernetes - 有一种简单的方法可以在kubernetes pod容器上禁用linux日志吗?

docker - 我如何获得一个docker容器来暴露端口,同时又阻止整个互联网?

Docker run --volume 不断创建随机卷而不使用指定的卷

Docker 组合使用 dockerfile 以外的名称

docker - Gitlab CI/Docker : Use custom image for job

docker - 在 docker build 期间无法找到 Ubuntu 软件包