我的Dockerfile有点像
FROM my/base
ADD . /srv
RUN pip install -r requirements.txt
RUN python setup.py install
ENTRYPOINT ["run_server"]
每次我构建一个新映像时,都必须重新安装依赖项,这在我所在的地区可能会非常缓慢
对于已安装的cache
软件包,我想到的一种方法是使用以下较新的映像覆盖my/base
映像:
docker build -t new_image_1 .
docker tag new_image_1 my/base
因此,下次使用此Dockerfile构建时,my/base已经安装了一些软件包
但这种解决方案有两个问题:
那么,我可以用什么更好的方法来解决这个问题呢
有关我机器上docker的一些信息:
☁ test docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070
☁ test docker info
Containers: 0
Images: 56
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Dirs: 56
Execution Driver: native-0.2
Kernel Version: 3.13.0-29-generic
WARNING: No swap limit support
为了尽量减少网络活动,您可以将
pip
指向主机上的缓存目录运行docker容器,将主机的pip缓存目录绑定装入容器的pip缓存目录
docker run
命令应如下所示:然后在Dockerfile中,将需求作为
ENTRYPOINT
语句(或CMD
语句)的一部分安装,而不是作为RUN
命令安装。这很重要,因为(如注释中所指出的)在映像构建期间(当执行RUN
语句时),挂载不可用。Docker文件应如下所示:尝试构建一个Dockerfile,其外观如下所示:
Docker将在pip安装期间使用缓存,只要您不对
requirements.txt
进行任何更改,而不管.
处的其他代码文件是否已更改。这里有一个例子下面是一个简单的
Hello, World!
程序:docker build的输出:
让我们修改
run.py
:再次尝试构建,以下是输出:
如上所示,这次docker在构建期间使用缓存。现在,让我们更新一下
requirements.txt
:以下是docker build的输出:
注意docker在pip安装期间是如何不使用缓存的。如果不起作用,请检查docker版本
我知道这个问题已经有了一些流行的答案。但是有一种更新的方法可以为包管理器缓存文件。我认为在将来,当BuildKit变得更加标准时,这可能是一个很好的答案
截至Docker 18.09,对BuildKit有实验性支持。BuildKit在Dockerfile中添加了对一些新功能的支持,包括experimental support for mounting external volumes到
RUN
步骤中。这允许我们为$HOME/.cache/pip/
之类的东西创建缓存我们将使用以下
requirements.txt
文件作为示例:Python
Dockerfile
的典型示例可能如下所示:使用
DOCKER_BUILDKIT
环境变量启用BuildKit后,我们可以在大约65秒内构建未缓存的pip
步骤:现在,让我们添加实验头并修改
RUN
步骤以缓存Python包:现在继续进行另一个构建。这应该需要同样的时间。但这一次,它正在我们新的缓存装载中缓存Python包:
大约60秒。类似于我们的第一个构建
对
requirements.txt
进行一个小更改(例如在两个包之间添加新行),以强制缓存失效并再次运行:只有16秒
我们得到了这种加速,因为我们不再下载所有的Python包。它们由包管理器缓存(本例中为
pip
),并存储在缓存卷装载中。卷装载提供给运行步骤,以便pip
可以重用我们已经下载的包这发生在任何Docker层缓存之外在更大的{}上,收益应该更好
注:
BuildKit工具在Docker Compose或其他直接使用Docker API的工具下不起作用。从1.25.0开始,Docker Compose中就支持此功能。见How do you enable BuildKit with docker-compose?docker system prune -a
时,它将被清除李>希望这些特性将成为Docker for building的一部分,BuildKit将成为默认设置。如果发生这种情况,我将尝试更新此答案
相关问题 更多 >
编程相关推荐