2016-02-26 68 views
1

According to the Docker documentation,docker build应缓存所有未更改的行。Dockerfile不一致缓存

问题是,即使我没有更改我的Dockerfile或仅更改它的结尾,图像也会从Dockerfile的起始位置或随机位置中重建。其他时候缓存按预期工作。我没有ADD命令。

我使用的建设我的形象的命令是docker build --tag=pineapple/orange .

输出开始了,像这样:

Step 1 : FROM centos:7 
---> 0f0be3675ebb 
Step 2 : MAINTAINER Dixie Chicks <[email protected]> 
---> Using cache 
---> 7669f54fc137 
Step 3 : RUN yum update &&  yum install -y epel-release &&  yum install -y wget      git      python-devel &&  wget "https://bootstrap.pypa.io/get-pip.py" &&  python get-pip.py 
---> Running in 92a8f1cff2db 
Loaded plugins: fastestmirror, ovl 
Determining fastest mirrors 
* base: centos.den.host-engine.com 
* extras: centos-mirror.jchost.net 
* updates: centos.chicago.waneq.com 
... [starts re-installing everything] 

是否构建缓存不明确的标签工作?我可以使用什么策略来弄清楚为什么会发生这种情况?

编辑:如果它有所不同,我一直在编辑PyCharm内的Dockerfile。

+0

我只看到一次运行。不一致意味着什么? –

回答

2

我宁愿一个Dockerfile的第一线隔离在自己的基地形象:

FROM centos 
MAINTAINER Dixie Chicks <[email protected]> 
RUN yum update && \ 
    yum install -y epel-release && \ 
    yum install -y wget \ 
        git \ 
        python-devel && \ 
    wget "https://bootstrap.pypa.io/get-pip.py" && \ 
    python get-pip.py 

我建立一个基本映像一次,然后我创建另一个Dockerfile从开始:

FROM myBaseImage 

这样,我可以根据需要重新构建我的第二个Dockerfile,所有先决条件安装在第一个映像中已经完成(并且从不重新编译)。

0

缓存基于三角洲系统(差异)。

Yum更新和你的命令中的一些几乎不会以相同的增量结束。所需要的是第三方回购为该文件进行更新以成为不同的散列。随着软件包的变化,最终的结果将会变得不同。

它基本上不能缓存。如果你有一套特定的软件包来确保做VonC所说的并将其打包在一个必备的容器中,那么你最好打赌一下。

当我这样做时,这也使得我的操作方面感到高兴,因为我知道如果现在构建它,而现在7天后,我会得到相同的包。在您的示例中,如果您现在构建它并收到wget- {version a},则可以在将来再次构建它并获取wget- {version b}。也许这个版本在旗帜或图书馆等方面有所不同,并且会导致连锁反应,并且您的应用程序会根深蒂固地行为。虽然罕见,但这并非不可能。

+0

yum对缓存的影响很好的解释。 +1。我的答案中没有。 – VonC

+0

我不认为这是真的。 Docker文档:“除了ADD和COPY命令之外,缓存检查不会查看容器中的文件来确定缓存匹配。例如,在处理RUN apt-get -y update命令时,容器中更新的文件将会不被检查以确定缓存命中是否存在,在这种情况下,只是命令字符串本身将用于查找匹配。“ – szxk

+0

您可能是对的,我已经看到一些错误票据来表明其不一致。然而,回顾最初的问题时,很难看出它应该被缓存。也许连续两次运行的输出可能会有帮助 –