在构建期间将大文件添加到 docker

Adding large files to docker during build

我的服务在 运行 时需要一些大文件(~ 100MB-500MB) 这些文件可能会偶尔更改,我不介意重建我的容器并在它发生时重新部署它。

我想知道在构建期间存储和使用它的最佳方式是什么,以便团队中的任何人都可以更新容器并重建它。

到目前为止,我最好的想法是将这些大文件存储在 git LFS 的每个版本的不同分支中。这样我就可以将它添加到我的 Dockerfile 中:

RUN git clone -b 'version_2.0' --single-branch --depth 1 https://...git.git

这样,如果这些大文件发生变化,我只需要更改 Dockerfile 中的 version_2.0,然后重新构建。

还有其他推荐的方法吗?我考虑过将这些文件存储在 Dropbox 中,然后在构建

期间使用 wget 通过 link 获取它们

P.S - 这些大文件是一些深度网络的权重

编辑 - 问题是在 docker 中存储大文件的合理方法是什么 developer/team 可以更改文件和匹配代码,并将记录在案 (git) 并且可以很容易地被另一个团队使用甚至部署(因此,本地 PC 上的大文件很糟糕,因为它需要发送给另一个团队)

These files might change once in a while, and I don't mind to rebuild my container and re-deploy it when it happens.

然后源代码控制不是最适合此类工件的。

Nexus or Artifactory 这样的二进制工件存储服务(它们都有免费版本,如果需要的话还有自己的 docker 图像)更适合这项任务。

从那里,您的 Dockerfile 可以从 Nexus/Artifactory 您的大文件中获取。
.

见此处

如果您有私人 docker 注册中心,您可以使用已经包含的这些文件构建基础镜像。然后在您服务的 Dockerfile 中有 FROM 指令指向该基础图像。

然后,当其他团队成员想要更新时,他们只需更新 Dockerfile 上的 FROM 指令。

使用这种方法,原始文件的保存位置无关紧要,因为它们只在构建基础映像时使用一次。

我觉得我一定是误读了你的问题,因为答案对我来说似乎显而易见,但 none 的其他受访者提到了它。 因此,如果我严重误解了您的问题,请原谅我。

如果您的服务在 运行 时需要大文件并且它们会不时更改,则

  • 不要将它们包含在图像中;而是
  • 将它们安装为卷,

如果您确保这些文件是构建映像的最后(或最后一个)步骤,则构建可以利用以前版本的缓存。唯一要重建的是包含大文件的层(以及之后的任何步骤)。

下载新图像也只会下载最后一层。

至于重新部署,您需要确保所有数据(配置、tmp、...)都存储在一个卷中。 "redeploy" 然后可以使用 docker run ... --volumes-from=old-container ... 并立即再次可用。

如果您甚至在考虑 Dropbox,为什么不考虑 AWS S3?或者您可以将它们安装在某个卷或文件系统中。

这实际上归结为您构建容器的方式,例如,我们使用 Jenkins 和 fabric8 io 插件作为 maven 构建的一部分来构建我们的容器。我们将 ADD 与远程源 url (Nexus) 一起使用。

一般来说,您可以使用 URL 作为来源。所以这取决于您可以访问哪个存储。 1. 您可以创建一个 s3 存储桶并提供对 docker 构建器节点的访问权限。您可以在 docker 文件中添加 ADD http://example.com/big.tar.xz /usr/src/things/ 以构建

  1. 您可以将大文件上传到工件存储库(例如 Nexus 或 Artifactory)并在 ADD

  2. 中使用它
  3. 如果您使用 Jenkins 进行构建,请在同一主机中创建一个文件夹并配置网络服务器以使用虚拟主机配置提供该内容。然后使用 Url.

最佳解决方案是在不影响安全性的情况下在工作量和成本方面更便宜的解决方案。

卷作为单独的节点存在并在团队之间共享

只是为了补充 , I would advise you to use Kubernetes' Persistent Volumes 您的具体情况。

这些有什么帮助?

正如你所说,有多个团队,每个团队可能运行一个POD,简单来说就是一组容器和它们交互的规范(比如启动,传递数据等) .).换句话说,它是多个容器之间的逻辑连接。 这样的 PODs 通常 运行 在一个集群上,由 Kubernetes 的引擎管理。

持久卷 是集群中包含数据的另一个资源。与常规卷相比,这些 reisde 在集群中,并且可以通过指定 PersistentVolumeClaims.

由不同的 PODs 访问

使用这种方法你可以:

  • 容器的停机时间为零(PODs 的复制 根据需要集群)
  • 由团队中的任何人(或您的团队子集)更新您网络的权重
  • 从PODs获取权重更新而不干扰容器

IMO 这种方法比每次更改数据时仅重建容器更可持续。