docker build高效利用cache

原文链接:docker build高效利用cache

前言

Dockerfile 可以通过docker build命令构建为一个新的镜像,Dockerfile 中每一条命令都会构建出一个新的镜像层。当你重新build相同的Docker时,Docker会逐条语句check自身的cache镜像层,如果命中相同的,就使用cache而不执行这条语句继续往下逐条check直至build完成。Docker build cache相关知识可以参考docker build 的 cache 机制

本文主要讲述如何利用cache提高build的效率。

正文

1. build Dockerfile 部分使用 cache

目前 docker 利用 cache 的基本原理是在父节点存在 cache 的前提下 当前 dockerfile 的那条语句之前也构建过就可以用 cache。例外就是 ADD 和 COPY 需要计算一个 checksum。 大致意思就是如果你中间有一层不能用 cache 那之后的层次就都不能用了。因此主要功夫在写 dockerfile 上,尽量把不变的内容放在前面,频繁变化的内容放在最后。简单说就是 把 ADD 和 COPY 的内容放最后一句,这样很多情况下只有最后一层变,前面都能用 cache。 比如我们在Dockerfile中使用了RUN go get xxx,我们提交了一下最新代码,然后重新build时,会命中cache,导致build出的image使用的还是之前的代码。

▶ docker build -t="jeorch/ddsaas:1.0.1" ./
Sending build context to Docker daemon  266.2kB
Step 1/8 : FROM golang:alpine
 ---> 20ff4d6283c0
Step 2/8 : RUN apk add --no-cache git mercurial
 ---> Using cache
 ---> 7c76541453d4
Step 3/8 : RUN go get github.com/alfredyang1986/blackmirror
 ---> Using cache
 ---> b8a5b7464bed
Step 4/8 : RUN go get github.com/alfredyang1986/ddsaas
 ---> Using cache
 ---> 27e569d1cdf5
Step 5/8 : ADD deploy-config/ /go/bin/
 ---> Using cache
 ---> 0a72ad21b21c
Step 6/8 : RUN go install -v github.com/alfredyang1986/ddsaas
 ---> Using cache
 ---> beda69880a63
Step 7/8 : WORKDIR /go/bin
 ---> Using cache
 ---> f57778461a26
Step 8/8 : ENTRYPOINT ["ddsaas"]
 ---> Using cache
 ---> 4c41a3140c4d
Successfully built 4c41a3140c4d
Successfully tagged jeorch/ddsaas:1.0.1

我们可以在Dockerfile中的RUN go get xxx之前添加一句标识来阻断cache继续命中,这样接下来的语句都会重新执行而不继续check cache。我在Dockerfile中加入了一行“MAINTAINER Jeorch”,Step-2还会使用cache,而接下来的都不会使用cache。

▶ docker build -t="jeorch/ddsaas:1.0.1" ./
Sending build context to Docker daemon  266.2kB
Step 1/9 : FROM golang:alpine
 ---> 20ff4d6283c0
Step 2/9 : RUN apk add --no-cache git mercurial
 ---> Using cache
 ---> 7c76541453d4
Step 3/9 : MAINTAINER Jeorch
 ---> Running in 33bbfbd73508
Removing intermediate container 33bbfbd73508
 ---> ac2188cd26c4
Step 4/9 : RUN go get github.com/alfredyang1986/blackmirror
 ---> Running in 3363c4394984
Removing intermediate container 3363c4394984
 ---> db9237361148
Step 5/9 : RUN go get github.com/alfredyang1986/ddsaas
 ---> Running in 738534a17f5e
Removing intermediate container 738534a17f5e
 ---> fe40c81e076d
Step 6/9 : ADD deploy-config/ /go/bin/
 ---> ddad378cdf99
Step 7/9 : RUN go install -v github.com/alfredyang1986/ddsaas
 ---> Running in 74d83f8a7c9a
Removing intermediate container 74d83f8a7c9a
 ---> 50f17bf6530e
Step 8/9 : WORKDIR /go/bin
 ---> Running in a904feb924d2
Removing intermediate container a904feb924d2
 ---> f1297882f28d
Step 9/9 : ENTRYPOINT ["ddsaas"]
 ---> Running in 3dda764560b3
Removing intermediate container 3dda764560b3
 ---> 236b15602a89
Successfully built 236b15602a89
Successfully tagged jeorch/ddsaas:1.0.1

LABEL比MAINTAINER更灵活,推荐使用LABEL,弃用MAINTAINER。详情看深入Dockerfile(一): 语法指南

2. build Dockerfile 不使用cache

Dockerfile需要全部重新build,即我们不需要利用cache,我们可以在docker build 命令后使用–no-cache。

▶ docker build -t="jeorch/ddsaas:1.0.1" ./ --no-cache
Sending build context to Docker daemon  266.2kB
Step 1/8 : FROM golang:alpine
 ---> 20ff4d6283c0
Step 2/8 : RUN apk add --no-cache git mercurial
 ---> Running in 770bcf003ff2
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/16) Installing nghttp2-libs (1.32.0-r0)
(2/16) Installing libssh2 (1.8.0-r3)
(3/16) Installing libcurl (7.61.1-r1)
(4/16) Installing expat (2.2.5-r0)
(5/16) Installing pcre2 (10.31-r0)
(6/16) Installing git (2.18.1-r0)
(7/16) Installing libbz2 (1.0.6-r6)
(8/16) Installing libffi (3.2.1-r4)
(9/16) Installing gdbm (1.13-r1)
(10/16) Installing ncurses-terminfo-base (6.1_p20180818-r1)
(11/16) Installing ncurses-terminfo (6.1_p20180818-r1)
(12/16) Installing ncurses-libs (6.1_p20180818-r1)
(13/16) Installing readline (7.0.003-r0)
(14/16) Installing sqlite-libs (3.24.0-r0)
(15/16) Installing python2 (2.7.15-r1)
(16/16) Installing mercurial (4.6.1-r0)
Executing busybox-1.28.4-r0.trigger
OK: 80 MiB in 30 packages
Removing intermediate container 770bcf003ff2
 ---> 86dfeb5c30c2
Step 3/8 : RUN go get github.com/alfredyang1986/blackmirror
 ---> Running in d7dd1c8fab79
Removing intermediate container d7dd1c8fab79
 ---> c7b61e4b6722
Step 4/8 : RUN go get github.com/alfredyang1986/ddsaas
 ---> Running in c783e5fe874c
Removing intermediate container c783e5fe874c
 ---> c07eda8eb619
Step 5/8 : ADD deploy-config/ /go/bin/
 ---> aa51cfe6311f
Step 6/8 : RUN go install -v github.com/alfredyang1986/ddsaas
 ---> Running in 6ca73a6969df
Removing intermediate container 6ca73a6969df
 ---> be7090e0095e
Step 7/8 : WORKDIR /go/bin
 ---> Running in 9f19f951d662
Removing intermediate container 9f19f951d662
 ---> a0894151c5e6
Step 8/8 : ENTRYPOINT ["ddsaas"]
 ---> Running in 9404dad6e3bf
Removing intermediate container 9404dad6e3bf
 ---> 2681d9a56d7b
Successfully built 2681d9a56d7b
Successfully tagged jeorch/ddsaas:1.0.1

3. build Dockerfile 全部利用cache

正常执行docker build就行。

参考

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值