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

$ docker build -t u12_core -f u12_core .

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

Step 1 : FROM ubuntu:12.04
 ---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <pavan.gupta@gmail.com>
 ---> 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选项:

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

在旧版本的Docker中,你需要传递——no-cache=true,但现在不再是这样了。


命令docker构建——no-cache。解决了我们类似的问题。

我们的Dockerfile是:

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

但应该是:

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

为了防止缓存更新和安装分开。

参见:编写Dockerfiles的最佳实践


在一些极端的情况下,避免重复构建失败的唯一方法是运行:

docker system prune

该命令将要求您确认:

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]

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


我不建议在你的情况下使用-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构建器修剪-af


使用docker-compose尝试docker-compose up -d——build -force- rebuild


为了确保构建完全重新构建,包括检查基本映像的更新,在构建时使用以下选项:

——no-cache -这将强制重建已经可用的层

——pull——这将触发使用FROM引用的基本映像的拉取,以确保您获得了最新版本。

因此,完整的命令看起来像这样:

docker build --pull --no-cache --tag myimage:version .

docker-compose也有相同的选项:

docker-compose build --no-cache --pull

注意,如果docker-compose文件引用了一个图像,——pull选项实际上不会拉出已经存在的图像。

要强制docker-compose重新拉出这个,你可以运行:

docker-compose pull

这里的大部分信息都是正确的。 这里是它们的汇编和我使用它们的方式。

我们的想法是坚持推荐的方法(特定于构建,对其他存储的docker对象没有影响),当它不够时,尝试更激进的方法(不特定于构建,对其他存储的docker对象有影响)。

推荐方法:

1)强制执行Dockerfile中的每个步骤/指令:

docker build --no-cache 

或者使用docker-compose构建:

docker-compose build --no-cache

我们也可以把它和up子命令结合起来,重新创建所有的容器:

docker-compose build --no-cache &&
docker-compose up -d --force-recreate 

这些方法不使用缓存,但用于docker构建器和引用FROM指令的基映像。

2)清除docker构建器缓存(如果我们使用Buildkit,我们很可能需要它):

docker builder prune -af

3)如果我们不想使用父映像的缓存,我们可以尝试删除它们,例如:

docker image rm -f fooParentImage

在大多数情况下,这3件事足以让我们干净地构建我们的形象。 所以我们应该坚持这一点。

更激进的方法:

在一些角落的情况下,似乎在构建过程中,docker缓存中的一些对象仍然被使用,并且看起来是可重复的,我们应该尝试了解原因,以便能够非常具体地擦除缺失的部分。 如果我们真的找不到从头开始重建的方法,还有其他方法,但重要的是要记住,这些方法通常会删除比所需的多得多的东西。因此,当我们不在本地/开发环境中时,我们应该谨慎使用它们。

1)删除所有没有关联至少一个容器的图像:

docker image prune -a

2)删除更多的东西:

docker system prune -a

上面写着:

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

使用super delete命令可能还不够,因为它强烈依赖于容器的状态(运行与否)。 当这个命令还不够时,我会仔细考虑哪些docker容器会对我们的docker构建产生副作用,并允许退出这些容器,以便使用命令将它们删除。


gui驱动的方法:打开docker桌面工具(通常随docker一起提供):

在“容器/应用程序”下停止该映像的所有运行实例 在“Images”下删除构建图像(将鼠标悬停在框名上以获得上下文菜单),最终也删除底层基本图像