关于aerospike:如何强制Docker清晰地构建图像

How to force Docker for a clean build of an image

我已经使用下面的命令从Docker文件构建了Docker映像。

1
$ docker build -t u12_core -f u12_core .

当我试图用相同的命令重建它时,它使用的构建缓存如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Step 1 : FROM ubuntu:12.04
 ---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <[email protected]>
 ---> Using cache
 ---> 4354ccf9dcd8
Step 3 : RUN apt-get update
 ---> Using cache
 ---> bcbca2fcf204
Step 4 : RUN apt-get install -y openjdk-7-jdk
 ---> Using cache
 ---> 103f1a261d44
Step 5 : RUN apt-get install -y openssh-server
 ---> Using cache
 ---> dde41f8d0904
Step 6 : RUN apt-get install -y git-core
 ---> Using cache
 ---> 9be002f08b6a
Step 7 : RUN apt-get install -y build-essential
 ---> Using cache
 ---> a752fd73a698
Step 8 : RUN apt-get install -y logrotate
 ---> Using cache
 ---> 93bca09b509d
Step 9 : RUN apt-get install -y lsb-release
 ---> Using cache
 ---> fd4d10cf18bc
Step 10 : RUN mkdir /var/run/sshd
 ---> Using cache
 ---> 63b4ecc39ff0
Step 11 : RUN echo 'root:root' | chpasswd
 ---> Using cache
 ---> 9532e31518a6
Step 12 : RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
 ---> Using cache
 ---> 47d1660bd544
Step 13 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
 ---> Using cache
 ---> d1f97f1c52f7
Step 14 : RUN wget -O aerospike.tgz 'http://aerospike.com/download/server/latest/artifact/ubuntu12'
 ---> Using cache
 ---> bd7dde7a98b9
Step 15 : RUN tar -xvf aerospike.tgz
 ---> Using cache
 ---> 54adaa09921f
Step 16 : RUN dpkg -i aerospike-server-community-*/*.deb
 ---> Using cache
 ---> 11aba013eea5
Step 17 : EXPOSE 22 3000 3001 3002 3003
 ---> Using cache
 ---> e33aaa78a931
Step 18 : CMD /usr/sbin/sshd -D
 ---> Using cache
 ---> 25f5fe70fa84
Successfully built 25f5fe70fa84

缓存显示已安装Aerospike。但是,我在从该图像生成的容器中找不到它,因此我希望不使用缓存重新生成该图像。我怎么能强迫Docker在没有缓存的情况下重建一个干净的图像?


有一个--no-cache选项:

1
docker build --no-cache -t u12_core -f u12_core .

在老版本的Docker中,您需要通过--no-cache=true,但现在已经不是这样了。


在一些极端的情况下,解决重复出现的构建失败的唯一方法是运行:

1
docker system prune

命令将要求您确认:

1
2
3
4
5
6
WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all networks not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N]

这当然不是问题的直接答案,但可能会挽救一些生命…它确实救了我。


指挥部docker build --no-cache .解决了我们类似的问题。

我们的文件是:

1
2
RUN apt-get update
RUN apt-get -y install php5-fpm

但应该是:

1
RUN apt-get update && apt-get -y install php5-fpm

以防止缓存更新并单独安装。

参见:编写dockerfiles的最佳实践


我不建议在你的情况下使用--no-cache

您正在运行从步骤3到9的两个安装(顺便说一句,我更喜欢使用一行程序),如果您不希望每次构建映像时都重新运行这些步骤的开销,您可以在执行wget指令之前使用临时步骤修改Dockerfile

我曾经做过类似于RUN ls .的事情,把它改成RUN ls ./,然后再改成RUN ls ./.等等,对wget检索到的tarball所做的每一次修改。

当然,您可以做一些类似于RUN echo 'test1' > test && rm test的事情,为每个迭代增加'test1中的数字。

它看起来很脏,但据我所知,它是从Docker的缓存系统中继续受益的最有效的方法,这在您有很多层的时候节省了时间…


您可以使用docker builder管理构建器缓存。

要在不提示的情况下清除所有缓存:docker builder prune -af