怎样使用docker build cache

简介

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版本的镜像不建议用在生产环境,最好是指定一个版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值