Docker docker-没有获取相关的缓存图像

时间:2016-08-23 11:04:47

标签: docker virtualization docker-compose

我跑docker-compose build celery并且(经过数小时尝试我的连接不良)后,它成功了。 app Dockerfile的前80%是相同的,但它没有重用缓存。据我所知,Docker比较了基本映像和Dockerfile中的指令,并尽可能重用。

更新:这个问题所指的问题消失了,不明白为什么。以下注释。

但我得到了:

docker-compose build celery
Building celery
Step 1 : FROM python:2.7
 ---> eb867117097c
Step 2 : RUN apt-get update && apt-get install -y vim gdal-bin libgdal-dev postgresql-client
 ---> Using cache
 ---> 2966946ca235

. . . identical steps . . .

Step 9 : RUN pip install --no-cache-dir -r requirements/production.txt
 ---> Running in 02b42f721a34
Collecting git+https://github.com . . .
. . .
 ---> f70ecc01cada
Removing intermediate container 02b42f721a34
Step 10 : RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 ---> Running in 3575383edcef

当我输入docker images时,我可以看到f70ecc01cada,但未在以下内容中找到:

docker-compose build app
Building app
Step 1 : FROM python:2.7
 ---> eb867117097c
Step 2 : RUN apt-get update && apt-get install -y vim gdal-bin libgdal-dev postgresql-client
 ---> Using cache
 ---> 03e5040df047

. . . identical steps . . .

Step 9 : RUN pip install --no-cache-dir -r requirements/production.txt
 ---> Running in bb26fab28548
Collecting git+https://github.com . . .
. . .

我认为后者应该重用f70ecc01cada缓存图像吗? [编辑:我现在意识到03e5040df047只是一个容器,感谢@Ohmen,所以没有必要删除它]

我已经尝试将docker-compose编辑为相同的内存等,但它没有帮助。我可以强制重复使用吗?

更新:app版本突然开始从celery版本中获取缓存。我不知道修复它的原因。在它失败和工作之间,我确实在Dockerfiles发散之前连接到celery层次结构上的图像,手动运行app图像上的其余命令docker run -it ... --entry=bash,{{1} }和adduser),以及chown app/生成的容器。然后我重新运行docker committed,由于某种原因,它正确地从docker-compose build app层次结构中获取了缓存,并成功运行了其余命令(创建用户和chown)。我不知道是什么让它突然发挥作用。

编辑:两个图像树的Docker历史记录,显示历史记录在celery行上分歧。也许我同时运行两个版本?我很确定我没有,因为我的连接需要一个小时或更长时间,但也许这就是无聊和令人尴尬的解释。也许Docker随机选择随后失败的树,然后随机(在56次尝试之后)选择了那个没有的树。

初始成功构建 - 自下而上排序的层:

RUN apt-get update && apt-get install -y vim gdal-bin libgdal-dev postgresql-client

其次,使用相同的脚本进行构建失败:

Chriss-MacBook-Pro:~ technicaltitch$ docker history fdw_celery
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
d71bf8f2b902        28 hours ago        /bin/sh -c #(nop)  ENTRYPOINT ["/bin/sh" "-c"   0 B                 
336bdb2b9ca9        28 hours ago        /bin/sh -c #(nop)  USER [celery]                0 B                 
a1259f89bc1f        28 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   15.39 MB            
57dd9a330337        28 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   335.2 kB            
3accad8aa55c        28 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   0 B                 
b4ff0c1d71fb        28 hours ago        /bin/sh -c #(nop) COPY dir:a8f922c5264fe2275a   15.39 MB            
bc65bc84abbc        28 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   0 B                 
f70ecc01cada        28 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   214.1 MB            
85eb413bd5da        28 hours ago        /bin/sh -c #(nop)  ARG PIP_INDEX_URL=https://   0 B                 
3cee97bf3ce1        28 hours ago        /bin/sh -c #(nop)  ARG PIP_TRUSTED_HOST=127.0   0 B                 
cb090c4b1886        28 hours ago        /bin/sh -c #(nop)  WORKDIR /usr/src/app         0 B                 
d0a1d3d15f94        28 hours ago        /bin/sh -c #(nop) COPY dir:ec1503af2cbef5220d   3.145 kB            
e27ecd707562        28 hours ago        |1 http_proxy= /bin/sh -c mkdir -p /usr/src/a   0 B                 
0b6e2857206c        28 hours ago        |1 http_proxy= /bin/sh -c VERSION=$(gdal-conf   5.903 MB            
2966946ca235        29 hours ago        |1 http_proxy= /bin/sh -c apt-get update && a   241.4 MB            
eb867117097c        42 hours ago        /bin/sh -c #(nop) CMD ["python2"]               0 B                 

最后,这是神奇地成功后的图像历史。我没有删除其他图像,当这工作(并仍然没有):

Chriss-MacBook-Pro:~ technicaltitch$ docker history 5ee
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
5ee29875a771        29 hours ago        /bin/sh -c #(nop)  ARG PIP_INDEX_URL=https://   0 B                 
daad37fd701b        29 hours ago        /bin/sh -c #(nop)  ARG PIP_TRUSTED_HOST=127.0   0 B                 
f891ee9277da        29 hours ago        /bin/sh -c #(nop)  WORKDIR /usr/src/app         0 B                 
2cce4acf9f2f        29 hours ago        /bin/sh -c #(nop) COPY dir:ec1503af2cbef5220d   3.145 kB            
9484e6b7fa51        29 hours ago        |1 http_proxy=None /bin/sh -c mkdir -p /usr/s   0 B                 
0031cdd56926        29 hours ago        |1 http_proxy=None /bin/sh -c VERSION=$(gdal-   5.903 MB            
03e5040df047 <-- [already diverged]      |1 http_proxy=None /bin/sh -c apt-get update    243.1 MB            
eb867117097c        42 hours ago        /bin/sh -c #(nop) CMD ["python2"]               0 B                 

以下是两个Dockerfiles的开头。我已经尝试使docker-compose.yml中的机器定义相同但无效(可能在03e图像创建之后)。

Chriss-MacBook-Pro:~ technicaltitch$ docker history fdw_app
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
edc615da4d6f        26 hours ago        /bin/sh -c #(nop)  ENTRYPOINT ["/usr/src/app/   0 B                 
747c8744f6a7        26 hours ago        /bin/sh -c #(nop)  EXPOSE 8000/tcp              0 B                 
8c543333e10b        26 hours ago        /bin/sh -c #(nop)  USER [django]                0 B                 
b08f02d80d29        26 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   15.39 MB            
ba42415ad78b        26 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   335.2 kB            
027e0c8e39a9        26 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   0 B                 
d56a78c02d18        26 hours ago        /bin/sh -c #(nop) COPY dir:9274abe4540edd1e86   15.39 MB            
bc65bc84abbc        28 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   0 B                 
f70ecc01cada        28 hours ago        |3 PIP_INDEX_URL=https://pypi.python.org/simp   214.1 MB            
85eb413bd5da        28 hours ago        /bin/sh -c #(nop)  ARG PIP_INDEX_URL=https://   0 B                 
3cee97bf3ce1        28 hours ago        /bin/sh -c #(nop)  ARG PIP_TRUSTED_HOST=127.0   0 B                 
cb090c4b1886        28 hours ago        /bin/sh -c #(nop)  WORKDIR /usr/src/app         0 B                 
d0a1d3d15f94        28 hours ago        /bin/sh -c #(nop) COPY dir:ec1503af2cbef5220d   3.145 kB            
e27ecd707562        28 hours ago        |1 http_proxy= /bin/sh -c mkdir -p /usr/src/a   0 B                 
0b6e2857206c        28 hours ago        |1 http_proxy= /bin/sh -c VERSION=$(gdal-conf   5.903 MB            
2966946ca235 <-- [correct img, suddenly..why?!]  ..xy= /bin/sh -c apt-get update && a   241.4 MB            
eb867117097c        42 hours ago        /bin/sh -c #(nop) CMD ["python2"]               0 B                 

2 个答案:

答案 0 :(得分:2)

  

COPY要求/ usr / src / app / requirements

如果您更改此目录中的任何文件,它将从此时起使缓存无效。这包括由编辑器创建的tmp文件,除非您将它们放在.dockerignore文件中。

  

ARG PIP_TRUSTED_HOST = 127.0.0.1   ARG PIP_INDEX_URL = https://pypi.python.org/simple/

如果您更改这些ARG中的任何一个,它将从此时开始使缓存无效。

我的猜测是其中一个更改,导致它跳过缓存。

答案 1 :(得分:1)

---> 03e5040df047只是容器的临时名称,并不表示不同的图像......

如果已知基本映像且命令相同,则Docker将使用缓存。对于ADD od COPY,文件的校验和也必须匹配。好像我可以告诉docker在你的代码片段中使用缓存。

您只能强制停靠者not使用缓存。