当我在生产服务器上通过Jenkins构建而不是在我的本地机器上构建时,由于我的基本Python镜像,我随机时间观察缓存失败,这有点奇怪。这种破坏在随机时间发生,并非总是如此。我还没有找到一个模式。
我的docker文件的前几条命令:
FROM python:2.7
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install --assume-yes apt-utils
RUN apt-get update && apt-get install -y curl
RUN apt-get update && apt-get install -y unzip
构建过程的日志(内部版本号:74),没有缓存破坏:
17:11:02 [workspace] Running shell script
17:11:02 + docker build -t ourapi:0.5.3 .
17:11:02 Sending build context to Docker daemon 232.4 kB
17:11:03 Step 1/14 : FROM python:2.7
17:11:03 ---> 26bddf7dbe1b
17:11:03 Step 2/14 : RUN mkdir -p /usr/src/app
17:11:03 ---> Using cache
17:11:03 ---> ec1bf9b7071a
17:11:03 Step 3/14 : WORKDIR /usr/src/app
17:11:03 ---> Using cache
17:11:03 ---> df4b29a9466b
下一个破坏了缓存:
15:28:48 [workspace] Running shell script
15:28:48 + docker build -t ourapi:0.5.8 .
15:28:48 Sending build context to Docker daemon 243.2 kB
15:28:48 Step 1/14 : FROM python:2.7
15:28:50 2.7: Pulling from library/python
15:28:50 aa18ad1a0d33: Already exists
15:28:50 15a33158a136: Already exists
15:28:50 f67323742a64: Already exists
15:28:50 c4b45e832c38: Already exists
15:28:50 b71152c33fd2: Pulling fs layer
15:28:50 299c2fe5f47f: Pulling fs layer
15:28:50 6116a194f6b5: Pulling fs layer
15:28:50 3631cfa2c8cc: Pulling fs layer
15:28:50 3631cfa2c8cc: Waiting
15:28:50 6116a194f6b5: Verifying Checksum
15:28:50 6116a194f6b5: Download complete
15:28:50 b71152c33fd2: Verifying Checksum
15:28:50 b71152c33fd2: Download complete
15:28:51 299c2fe5f47f: Verifying Checksum
15:28:51 299c2fe5f47f: Download complete
15:28:51 b71152c33fd2: Pull complete
15:28:51 3631cfa2c8cc: Download complete
15:28:53 299c2fe5f47f: Pull complete
15:28:53 6116a194f6b5: Pull complete
15:28:53 3631cfa2c8cc: Pull complete
15:28:53 Digest: sha256:0cb0d5aa3cbb61374d83ce324e8ffee86cebc66a94c4d5ab08a67b650538d660
15:28:53 Status: Downloaded newer image for python:2.7
15:28:53 ---> 26bddf7dbe1b
更新:发生这种情况是因为我们的Jenkins管道中的脚本正在运行清除脚本,该脚本删除了这些基本映像。
答案 0 :(得分:1)
docker cache依赖于服务器上现有的先前层以及运行相同命令的缓存层。从您提供的命令,您没有将--pull
传递给构建命令,因此它不是python图像上游更改的结果。剩下的两个可能原因是:
您很可能已删除了之前的版本,也可能删除了基本图像。使用docker rmi
,docker image prune
或docker system prune
命令会发生这种情况。
您可以更新构建服务器上的python映像。你提供的日志没有显示这个,但我留下它以防你的其他缓存破坏没有显示“拉动”输出。在那种情况下,另一个构建或外部进程可以提取python:2.7的新副本,这将使此构建的缓存无效,因为python:2.7标记现在指向新的图像ID。您会在日志中看到这个新ID。