简介

docker build的过程需要一段时间,它可能是下载基础镜像,下载和安装依赖包,这就是使用cache的原因。

有关Docker build cache

docker是分层构建的,Dockerfile中的每条指令就是一层。

FROM alpine:latest
RUN apk add --no-cache bash
ADD entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]

上面的镜像会运行一个脚本,打印当前时间并睡眠60秒。

#!/bin/bash

while :
do
  echo $(date)
  sleep 60
done

第一次构建构建竟像时,四条指令都会执行,但是从第二次开始就会使用cache,如下

$ docker build -t print-date-time .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM alpine:3.12
 ---> a24bb4013296
Step 2/4 : RUN apk add --no-cache bash
 ---> Using cache
 ---> 52f7aaec5411
Step 3/4 : ADD entrypoint.sh /
 ---> Using cache
 ---> 66ba9eee7c3c
Step 4/4 : ENTRYPOINT ["/entrypoint.sh"]
 ---> Using cache
 ---> 91a39deabc0b
Successfully built 91a39deabc0b
Successfully tagged print-date-time:latest

docker构建镜像时会检测Dockerfile是否改变,如果没有改变,就会直接使用cache,如果某一条指令发生改变,那么从改变的那一条指令开始以及后面的指令都会重新构建。

使用ADDCOPY指令时,docker会检测文件内容是否改变,如果文件内容,那么这条指令以及后面的指令也会重新构建。

docker的这些优化会加快我们构建镜像的时间,但是有时候却会阻碍我们更新镜像

什么时候不使用cache

Dockerfile中有时候会包含下载安装工具的命令,例如上面的例子中,我们下载了bash,但是如果因为一些的原因更新Bash包,Docker却不会重新拉取这个包。可以使用--no-cache避免使用cache来解决这个问题。

$ docker build -t print-date-time --no-cache .

--no-cache参数会让docker忽略cache,但是这对第一个FROM指令是不生效的,上面的例子中使用latest版本的基础镜像,但是这个镜像可会发生变化,--pull参数会让docker每次构建时都回去拉取基础镜像。

$ docker build -t print-date-time --pull .

但是latest版本的镜像不建议用在生产环境,最好是指定一个版本。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐