简介
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,如果某一条指令发生改变,那么从改变的那一条指令开始以及后面的指令都会重新构建。
使用ADD
和COPY
指令时,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版本的镜像不建议用在生产环境,最好是指定一个版本。