泊坞窗docker – 撰写不拾起相关的caching图像

我跑docker-compose build celery和(经过几个小时的尝试,我的不良连接),它成功了。 app Dockerfile的前80%是相同的,但不会重用caching。 从我可以告诉浏览的内容来看,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 

当我inputdocker 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 . . . . . . 

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

我已经尝试编辑docker构成相同的内存等,但它没有帮助。 我可以强制重用吗?


更新: app构build突然开始从celerybuild立拿起caching。 我不知道是什么修复了它。 在它失败和工作之间,我没有连接到在Dockerfiles分歧之前的celery层次结构的图像,手动运行app图像上的其余命令(docker run -it docker run -it ... --entry=bashadduserchown app/ ),并且docker committed了结果容器。 然后,我重新运行docker-compose build app ,由于某种原因,它正确地从celery层次中拾取了caching,并成功运行了其余的命令(创build用户和chown)。 我不知道是什么让它突然工作。


编辑:两个图像树的Docker历史logging,显示历史分歧在线上RUN apt-get update && apt-get install -y vim gdal-bin libgdal-dev postgresql-client 。 也许我同时运行了两个版本? 我很确定我没有,因为我的关系他们需要一个小时或更多,但也许这是无聊和尴尬的解释。 也许Docker会随机select随后失败的树,然后随机select一个没有的树。

最初的成功构build – 从下到上的顺序排列:

 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 

其次,构build失败,使用相同的脚本:

 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 

最后,这是神奇地成功后的形象历史。 当这个工作(并且还没有)时,我没有删除其他图像:

 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 

以下是两个Dockerfiles的开始。 我试图使docker-compose.yml中的机器定义完全相同,但无济于事(可能在创build了03e映像之后)。

 FROM python:2.7 RUN apt-get update && apt-get install -y vim gdal-bin libgdal-dev postgresql-client # On Jessie, $(gdal-config --version) gives 1.10.1 and Pypi only has 1.10.0 # so we need to strip the last part of the version number RUN VERSION=$(gdal-config --version); CFLAGS=$(gdal-config --cflags) easy_install GDAL==${VERSION%.*} RUN mkdir -p /usr/src/app/requirements COPY requirements /usr/src/app/requirements WORKDIR /usr/src/app ARG PIP_TRUSTED_HOST=127.0.0.1 ARG PIP_INDEX_URL=https://pypi.python.org/simple/ RUN pip install --no-cache-dir -r requirements/production.txt # Clean up APT when done. RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* COPY . /usr/src/app RUN mkdir -p /usr/src/app/log 

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

如果基础镜像已知并且命令相同,则Docker将使用caching。 对于ADD COPY ,文件的校验和也必须匹配。 就好像我可以告诉docker使用您的代码段中的caching。

你只能强制dockernot使用caching。

COPY要求/ usr / src / app / requirements

如果您更改此目录中的ANY文件,则会从此时开始使caching无效。 这包括由编辑器创build的tmp文件,除非将它们放在.dockerignore文件中。

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

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

我的猜测是其中的一个变化,导致它跳过caching。