首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在docker版本中使用pip缓存目录

在docker版本中使用pip缓存目录
EN

Stack Overflow用户
提问于 2019-09-20 04:07:14
回答 1查看 15.1K关注 0票数 55

我希望在我的docker build中尽快得到我的pip install指令。

我读过many posts解释说,如果你的requirements.txt没有改变,在其他应用程序之前添加你的requirements.txt如何帮助你利用Docker自己的图像缓存。但是,当依赖关系确实发生变化时,即使是轻微的变化,这也没有任何帮助。

下一步是我们是否可以使用一致的pip缓存目录。默认情况下,pip会将下载的包缓存到~/.cache/pip中(在Linux上),因此,如果您安装的模块版本与之前安装在系统上任何位置的模块版本相同,则不需要再次下载,只需使用缓存的版本即可。如果我们可以利用docker构建的共享缓存目录,这将有助于加快依赖项的安装速度。

但是,似乎没有任何简单的方法可以在运行docker build时挂载卷。构建环境似乎基本上是不可穿透的。我发现one article建议了一种天才但复杂的方法,在主机上运行rsync服务器,然后在构建内部使用黑客来获取主机IP,从主机同步pip缓存。但我不喜欢在Jenkins中运行rsync服务器的想法(即使在最好的情况下,这也不是最安全的平台)。

有没有人知道有没有其他方法可以更简单地实现共享缓存卷?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-20 11:24:27

我建议你使用buildkit,也可以看看this

文档文件:

代码语言:javascript
复制
# syntax = docker/dockerfile:experimental
FROM python:3.6-alpine
RUN --mount=type=cache,target=/root/.cache/pip pip install pyyaml

备注# syntax = docker/dockerfile:experimental是必须的,您必须在Dockerfile的开头添加它才能启用此功能。

1.

构建第一次执行:

代码语言:javascript
复制
export DOCKER_BUILDKIT=1
docker build --progress=plain -t abc:1 . --no-cache

第一个日志:

代码语言:javascript
复制
#9 [stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install...
#9   digest: sha256:55b70da1cbbe4d424f8c50c0678a01e855510bbda9d26f1ac5b983808f3bf4a5
#9 name: "[stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install pyyaml"
#9  started: 2019-09-20 03:11:35.296107357 +0000 UTC
#9 1.955 Collecting pyyaml
#9 3.050   Downloading https://files.pythonhosted.org/packages/e3/e8/b3212641ee2718d556df0f23f78de8303f068fe29cdaa7a91018849582fe/PyYAML-5.1.2.tar.gz (265kB)
#9 5.006 Building wheels for collected packages: pyyaml
#9 5.007   Building wheel for pyyaml (setup.py): started
#9 5.249   Building wheel for pyyaml (setup.py): finished with status 'done'
#9 5.250   Created wheel for pyyaml: filename=PyYAML-5.1.2-cp36-cp36m-linux_x86_64.whl size=44104 sha256=867daf35eab43c2d047ad737ea1e9eaeb4168b87501cd4d62c533f671208acaa
#9 5.250   Stored in directory: /root/.cache/pip/wheels/d9/45/dd/65f0b38450c47cf7e5312883deb97d065e030c5cca0a365030
#9 5.267 Successfully built pyyaml
#9 5.274 Installing collected packages: pyyaml
#9 5.309 Successfully installed pyyaml-5.1.2
#9completed: 2019-09-20 03:11:42.221146294 +0000 UTC
#9 duration: 6.925038937s

从上面,你可以看到第一次,构建将从互联网上下载pyyaml。

2.

构建第二次执行:

代码语言:javascript
复制
docker build --progress=plain -t abc:1 . --no-cache

第二个日志:

代码语言:javascript
复制
#9 [stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install...
#9   digest: sha256:55b70da1cbbe4d424f8c50c0678a01e855510bbda9d26f1ac5b983808f3bf4a5
#9 name: "[stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install pyyaml"
#9  started: 2019-09-20 03:16:58.588157354 +0000 UTC
#9 1.786 Collecting pyyaml
#9 2.234 Installing collected packages: pyyaml
#9 2.270 Successfully installed pyyaml-5.1.2
#9completed: 2019-09-20 03:17:01.933398002 +0000 UTC
#9 duration: 3.345240648s

从上面,你可以看到构建不再从互联网上下载包,只使用缓存。注意,这不是传统的docker构建缓存,因为我使用了--no-cache,它是我挂载到构建中的/root/.cache/pip

3.

删除构建包缓存的第三个执行构建:

代码语言:javascript
复制
docker builder prune
docker build --progress=plain -t abc:1 . --no-cache

第三个日志:

代码语言:javascript
复制
#9 [stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install...
#9   digest: sha256:55b70da1cbbe4d424f8c50c0678a01e855510bbda9d26f1ac5b983808f3bf4a5
#9 name: "[stage-0 2/2] RUN --mount=type=cache,target=/root/.cache/pip pip install pyyaml"
#9  started: 2019-09-20 03:19:07.434792944 +0000 UTC
#9 1.894 Collecting pyyaml
#9 2.740   Downloading https://files.pythonhosted.org/packages/e3/e8/b3212641ee2718d556df0f23f78de8303f068fe29cdaa7a91018849582fe/PyYAML-5.1.2.tar.gz (265kB)
#9 3.319 Building wheels for collected packages: pyyaml
#9 3.319   Building wheel for pyyaml (setup.py): started
#9 3.560   Building wheel for pyyaml (setup.py): finished with status 'done'
#9 3.560   Created wheel for pyyaml: filename=PyYAML-5.1.2-cp36-cp36m-linux_x86_64.whl size=44104 sha256=cea5bc4689e231df7915c2fc3abca225d4ee2e869a7540682aacb6d42eb17053
#9 3.560   Stored in directory: /root/.cache/pip/wheels/d9/45/dd/65f0b38450c47cf7e5312883deb97d065e030c5cca0a365030
#9 3.580 Successfully built pyyaml
#9 3.585 Installing collected packages: pyyaml
#9 3.622 Successfully installed pyyaml-5.1.2
#9completed: 2019-09-20 03:19:12.530742712 +0000 UTC
#9 duration: 5.095949768s

从上面可以看到是否删除了buildkit缓存,重新下载了包。

总而言之,它将在几次构建之间为您提供一个共享缓存,并且此缓存仅在映像构建时挂载。但是,图像本身不会有这些缓存,因此避免了图像中大量的中间层。

编辑适用于那些使用docker compose并且懒于阅读评论的人...:

如果设置了COMPOSE_DOCKER_CLI_BUILD=1,也可以使用docker-

执行此操作。例如: COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build -

根据folk的问题更新 2020/09/02:

我不知道来自哪个版本(我现在的版本是19.03.11),如果不指定缓存目录为mode,缓存将不会在下一次构建时重用。

不知道具体原因,可以在Dockerfile中添加mode=0755,,让它再次工作:

文档文件:

代码语言:javascript
复制
# syntax = docker/dockerfile:experimental
FROM python:3.6-alpine
RUN --mount=type=cache,mode=0755,target=/root/.cache/pip pip install pyyaml
票数 94
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58018300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档