我跑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
答案 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
使用缓存。