当前位置: 首页 > 面试题库 >

在Docker构建中使用pip缓存目录

逄烨
2023-03-14
问题内容

我希望尽快将自己的pip install说明放入docker builds中。

我读过许多 文章,解释了requirements.txt在应用程序其余部分之前添加您的内容如何在您requirements.txt未更改的情况下帮助您利用Docker自己的图像缓存。但是,如果依赖项确实发生了变化,甚至没有任何变化,这根本没有帮助。

下一步将是是否可以使用一致的pip缓存目录。默认情况下,pip它将在~/.cache/pip(在Linux上)缓存下载的软件包,因此,如果您要安装的模块的版本与系统上任何位置之前安装的模块相同,则无需重新下载它,但是而是简单地使用缓存的版本。如果我们可以将共享的缓存目录用于Docker构建,则可以大大加快依赖项的安装速度。

但是,似乎没有任何简单的方法可以在运行时挂载卷docker build。构建环境似乎基本上是不可渗透的。我发现有一篇文章提出了一种rsync在主机上运行服务器的天才但复杂的方法,然后在内部进行破解以获取主机IP,从而从主机中同步pip缓存。但是我不喜欢在Jenkins中运行rsync服务器的想法(最好的时间,这不是最安全的平台)。

有谁知道是否还有其他方法可以更简单地实现共享缓存量?


问题答案:

我建议你使用buildkit,也看到这个。

Dockerfile:

# 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。

第一次执行构建:

export DOCKER_BUILDKIT=1
docker build --progress=plain -t abc:1 . --no-cache

第一条日志:

#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

从上面可以看到,该构建将首次从Internet下载pyyaml。

2。

第二个执行构建:

docker build --progress=plain -t abc:1 . --no-cache

第二条日志:

#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

从上面可以看到,该构建不再从Internet下载软件包,只需使用缓存即可。注意,这不是我使用的传统docker build缓存--no- cache,而是/root/.cache/pip我安装到build中的。

3。

第三个执行构建,删除构建工具缓存:

docker builder prune
docker build --progress=plain -t abc:1 . --no-cache

第三条日志:

#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的层缓存表现出色感到惊讶,但我也想知道它如何确定是否可以使用缓存的层。 让我们以这些构建步骤为例: 例如,它如何知道可以使用缓存的层,但可以为其创建新层呢? 问题答案: 在Dockerfile最佳实践构建缓存部分中相当详尽地解释了构建缓存过程。 * 从缓存中已存在的基本映像开始,将下一条指令与从该基本映像派生的所有子映像进行比较,以查看是否其中一个是使用完全相同的指令构

  • 当我使用docker-maven-plugin构建docker映像时,它失败了 错误:无法执行目标com.spotify:docker-maven-plugin:1.0.0:build(default-cli)on project spring-boot-basic:捕获异常:basedir/root/workspace/spring-boot-basic/spring-boot-basic/sp

  • 我有一个简单的gradle项目,我想建立在Docker容器内 我有一个多级码头建设。第一阶段只是从github克隆项目。第二阶段必须建立项目,所以我可以在最后阶段运行它。但是它失败了 命令<代码>。/gradlew build - stacktrace无法执行并失败,错误为: 和stacktraces: 为什么docker用户没有在工作目录下创建文件的权限,如何添加这些权限?简单的< code >

  • 我有一个简单的Quarkus应用程序,我尝试使用以下多级Dockerfile构建它。 还有pom.xml 构建工作正常,它下载maven依赖项,然后它创建. jar并在最终容器中运行. jar。但是如果我更改源代码中的某些内容并保持pom.xml不变,依赖项会再次下载。似乎并没有下载所有依赖项。 有没有办法以这种方式加速docker构建?例如,我对Spring Boot做了同样的事情,那里一切都很

  • 笔者想通过jenkins实现一个简单的自动化部署,目前我的操作如下 在工程文件下面新建了dockerfile文件,通过多阶段构建来利用缓存提高构建速度 在jenkins构建时编写了脚本,主要操作就是删除上一次构建的容器和镜像文件,重写构建一个新的镜像和容器 但是有一个问题就是删除了上一次的镜像和容器docker的缓存是不是就是不在了,无法利用缓存来提高构建速度,如果我想利用dockerfile的缓

  • 我为一个网站写了一堆自动测试,并用它们创建了一个docker容器。我正在使用Selenium Grid,所以还有3个用于selenium-hub、chrome和Firefox浏览器实例的容器。起初构建该项目时遇到问题,因为selenium会话无法启动,原因是我认为应用程序容器(带有测试)在Grid和浏览器实例之前就已经构建和运行了。所以我必须编写一个dockerfile,带有健康检查的. sh脚本