如何强制Docker创建干净的映像

如何强制Docker创建干净的映像,docker,aerospike,Docker,Aerospike,我已经使用下面的命令从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 ---> 4354c

我已经使用下面的命令从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
步骤1:来自ubuntu:12.04
--->eb965dfb09d2
步骤2:维护人员Pavan Gupta
--->使用缓存
--->4354ccf9dcd8
步骤3:运行apt-get-update
--->使用缓存
--->BCA2FCF204
步骤4:运行apt get install-y openjdk-7-jdk
--->使用缓存
--->103f1a261d44
步骤5:运行apt get install-y openssh服务器
--->使用缓存
--->dde41f8d0904
步骤6:运行apt-get-install-y git-core
--->使用缓存
--->9be002f08b6a
步骤7:运行apt get install-y build-essential
--->使用缓存
--->a752fd73a698
步骤8:运行apt get install-y logrotate
--->使用缓存
--->93bca09b509d
步骤9:运行apt get安装-y lsb版本
--->使用缓存
--->fd4d10cf18bc
步骤10:运行mkdir/var/RUN/sshd
--->使用缓存
--->63b4ecc39ff0
步骤11:运行echo'root:root'| chpasswd
--->使用缓存
--->9532e31518a6
步骤12:在不使用密码的情况下运行sed-i的/permitrotlogin/permitrotlogin yes/'/etc/ssh/sshd_config
--->使用缓存
--->47d1660bd544
步骤13:运行sed's@session\s*必需\s*pam\u loginuid。so@session可选pam_loginuid。so@g'-i/etc/pam.d/sshd
--->使用缓存
--->d1f97f1c52f7
步骤14:运行wget-O aerospike.tgz'http://aerospike.com/download/server/latest/artifact/ubuntu12'
--->使用缓存
--->bd7dde7a98b9
步骤15:运行tar-xvf aerospike.tgz
--->使用缓存
--->54adaa09921f
步骤16:运行dpkg-i aerospike服务器社区-*/*.deb
--->使用缓存
--->11ABA0013EEA5
步骤17:曝光22 3000 3001 3002 3003
--->使用缓存
--->E33AA78A931
步骤18:CMD/usr/sbin/sshd-D
--->使用缓存
--->25f5fe70fa84
已成功构建25f5fe70fa84
缓存显示aerospike已安装。但是,我在从该图像生成的容器中找不到它,因此我希望在不使用缓存的情况下重建该图像。如何强制Docker在没有缓存的情况下重建干净的映像?

有一个
--无缓存选项:

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

在旧版本的Docker中,您需要传递
--no cache=true
,但情况不再如此。

命令
Docker build--no cache.
解决了类似的问题

我们的Dockerfile是:

RUN apt-get update
RUN apt-get -y install php5-fpm
但应该是:

RUN apt-get update && apt-get -y install php5-fpm
以防止缓存更新并单独安装


请参阅:

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

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]

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

我不建议在你的情况下使用
--无缓存

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

对于
wget
检索到的tarball,我通常会执行类似
运行ls.
的操作,并将其更改为
运行ls./
然后
运行ls./.
等等

当然,您可以执行类似于
运行echo'test1'>test和&rm test
的操作,为每个迭代增加
'test1
中的数字


它看起来很脏,但据我所知,这是继续受益于Docker缓存系统的最有效方式,它可以在您有许多层时节省时间…

您可以使用
Docker builder

要在没有提示的情况下清除所有缓存,请执行以下操作:
docker builder prune-af

使用docker compose尝试
docker compose up-d--build--force recreate

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

--无缓存
-这将强制重建已可用的层

--pull
-这将触发对使用引用的基本映像的拉取,以确保获得最新版本

因此,完整命令将如下所示:

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 build

docker-compose build --no-cache
我们还可以将其与重新创建所有容器的
up
子命令相结合:

docker-compose build --no-cache &&
docker-compose up -d --force-recreate 
这些方法不使用缓存,而是用于docker builder和用
FROM
指令引用的基本映像

2) 擦除docker builder缓存(如果我们使用Buildkit,我们很可能需要它):

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

docker image rm -f fooParentImage
在大多数情况下,这三件事足以完美地塑造我们的形象。
所以我们应该努力坚持这一点

更激进的方法:

在构建过程中,docker缓存中的某些对象似乎仍在使用,并且看起来是可重复的,在这种情况下,我们应该尝试理解能够非常明确地擦除缺失部分的原因。 如果我们真的找不到从头开始重建的方法
docker image rm -f fooParentImage
docker image prune -a
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