我们有一个Jenkins CI服务器,它从Git获取我们的代码,构build它,制作一个Docker镜像,然后将它发送到一些生产服务器。
我们的项目主要是用Python编写的,所以“构build”涉及到运行
pip install -r requirements.txt
这工作正常,除了它是一种缓慢。 它必须通过networking获取软件包,另外还需要为其中的一部分构buildC库(“lxml”不小!)。
在开发过程中,我使用了pip-accel来加速这个过程。 它具有与pip相同的接口,但它同时caching了Python下载和构build的C代码
pip-accel install -r requirements.txt
很快。
我想为我们的生产build立这样做,但我遇到了一些障碍。
显然, pip-accel需要一个目录来存储caching。 由于我们的CI服务器是运行构build的,所以这是合理的地方。 但是pip install命令在一个新的Docker容器中运行,所以它不能访问该服务器上的公共目录。
Docker的“卷”看起来就像是devise用于与容器共享目录,但是我们的构build在Docker构build中发生(惊喜),只有docker run允许你附加卷。 您不能使用docker build连接卷。
有什么我失踪? 我如何运行一个docker build和我的主机共享一个caching文件夹,在我的容器之外?
我对你的问题没有什么评价,所以我的回答也有一些问题。
我试着创build与你的设置相同的设置,但是缩小了(基于上面的解释),似乎Docker自己的caching机制有所改进
我的示例Dockerfile看起来像这样:
FROM ubuntu:14.04 RUN apt-get update \ && apt-get install -y python-pip python-dev build-essential \ && pip install pip-accel COPY requirements.txt /requirements.txt RUN pip-accel install -r /requirements.txt CMD tail -f /dev/null
而requirements.txt看起来像这样:
Flask==0.8 Jinja2==2.6 Werkzeug==0.8.3
第一次构build这个(看起来更长的时间)之后,我添加了一个新的库“chardet == 1.0.1”,现在我的requirements.txt如下所示:
Flask==0.8 Jinja2==2.6 Werkzeug==0.8.3 chardet==1.0.1
在运行Docker构build之后,它确实使用了所有的Docker自己的caching,这个caching也有旧的pip库
anovil@anovil-Latitude-E6440:~/tmp/serverfault/docker$ time docker build --rm . Sending build context to Docker daemon 3.072 kB Step 1 : FROM ubuntu:14.04 ---> 89d5d8e8bafb ... ... Removing intermediate container 337c23340e7a Step 5 : CMD tail -f /dev/null ---> Running in 5cb25bc75bbe ---> d3dfe184934b Removing intermediate container 5cb25bc75bbe Successfully built d3dfe184934b real 0m6.325s user 0m0.024s sys 0m0.012s
因为,默认情况下docker build有'–force-rm = false','–no-cache = false'。
如果您的Jenkins CI以不同的用户或不同的主机运行此构build,则可能会有所不同。 否则,它是在Dockerfile中命令命令的问题。
如果你仍然有问题,你可以分享你的示例Dockerfile,并告知这里每个jenkins构build多less/通常你的requirements.txt会改变。