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在没有缓存的情况下重建一个干净的图像?
有一个
1 | docker build --no-cache -t u12_core -f u12_core . |
在老版本的Docker中,您需要通过
在一些极端的情况下,解决重复出现的构建失败的唯一方法是运行:
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] |
这当然不是问题的直接答案,但可能会挽救一些生命…它确实救了我。
指挥部
我们的文件是:
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的最佳实践
我不建议在你的情况下使用
您正在运行从步骤3到9的两个安装(顺便说一句,我更喜欢使用一行程序),如果您不希望每次构建映像时都重新运行这些步骤的开销,您可以在执行
我曾经做过类似于
当然,您可以做一些类似于
它看起来很脏,但据我所知,它是从Docker的缓存系统中继续受益的最有效的方法,这在您有很多层的时候节省了时间…
您可以使用
要在不提示的情况下清除所有缓存: