CI系统中的我的docker构建器在不活动后被破坏,从而丢失了本地缓存。我使用--cache-from
首先从quay.io repo中提取最新图像,然后在下一个版本中将其用作--cache-from
。
我正在运行docker version 17.12.0-ce
。
Dockerfile(相关部分)如下所示:
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y \
ant \
build-essential \
software-properties-common \
libncurses5-dev \
libncursesw5-dev \
libcurl4-openssl-dev \
libboost-dev \
libfreetype6-dev \
zlib1g-dev \
r-base \
default-jdk \
python-dev \
python-setuptools \
python-pip \
python3-dev \
python3-setuptools \
python3-pip \
git \
wget \
unzip \
ghostscript \
pkg-config
RUN mkdir /software
WORKDIR /software
ENV PATH="/software:${PATH}"
RUN git clone --branch v0.2.19 --single-branch
https://github.com/xianyi/OpenBLAS
RUN cd OpenBLAS && make FC=gfortran TARGET=NEHALEM USE_THREAD=0 && make
PREFIX=/opt/openblas install
ENV LD_LIBRARY_PATH="/opt/openblas/lib:${LD_LIBRARY_PATH}"
# Install samtools dependencies
RUN wget http://zlib.net/zlib-1.2.11.tar.gz && tar -xvf zlib-1.2.11.tar.gz
RUN cd zlib-1.2.11 && ./configure && make && make install
RUN wget http://bzip.org/1.0.6/bzip2-1.0.6.tar.gz && tar -xvf bzip2-
1.0.6.tar.gz
RUN cd bzip2-1.0.6 && make && make install
RUN wget https://tukaani.org/xz/xz-5.2.3.tar.gz && tar -xvf xz-5.2.3.tar.gz
RUN cd xz-5.2.3 && ./configure && make && make install
RUN pip install common python-dateutil cython
RUN pip3 install common python-dateutil cython
# Install numpy 1.11.3 (python2/3)
RUN git clone --branch v1.11.3 --single-branch https://github.com/numpy/numpy
COPY /docker_image/site.cfg numpy/
RUN cd numpy && python setup.py install
RUN cd numpy && python3 setup.py install
当我使用(清理机器,缓存中没有任何内容)运行我的构建时:
docker pull quay.io/myorganization/myimage:tag
然后使用
运行构建docker build --cache-from=quay.io/myorganization/myimage:tag -f docker_image/Dockerfile -t quay.io/myorganization/myimage:newtag .
构建使用缓存,直到COPY /docker_image/site.cfg numpy/
使缓存无效。我的.dockerignore看起来像:
.git*
因此改变那里的事情不应该是问题。如果我不小心省略了所需的一些重要信息,请询问,我会及时提供。任何可能导致此特定位置的缓存失效的想法都将受到高度赞赏。
编辑:即使我没有通过执行以下操作来更改构建之间的仓库中的任何内容,也会发生此缓存失效:使用tag1构建映像,推送映像 到quay.io,然后在一台干净的机器上克隆git repo,拉图像(tag1),用tag2构建图像。可能是numpy repo元数据发生变化吗? (注意: - 根据我的理解,单个分支不应该提取有关该回购中其他分支的任何信息。)
答案 0 :(得分:4)
COPY
或ADD
命令的docker缓存使用文件和目录的哈希值。包含在该哈希中的是每个文件的内容,甚至是文件的权限。因此,如果其中任何一个由单个字节更改,则散列将不同,并且docker将具有缓存未命中,从而强制重新运行该行。
从第一次缓存未命中的角度来看,所有剩余的行都需要重建,因为前一层现在是新的,并且没有用于运行以下任何步骤。