Git 在构建期间向docker添加大文件

Git 在构建期间向docker添加大文件,git,docker,dockerfile,git-lfs,Git,Docker,Dockerfile,Git Lfs,我的服务在运行时需要一些大文件(~100MB-500MB) 这些文件可能会偶尔更改,我不介意重建容器并在发生更改时重新部署它 我想知道在构建过程中存储和使用它的最佳方式是什么,这样团队中的任何人都可以更新容器并重建它 到目前为止,我最好的想法是将这些大文件存储在git LFS中,每个版本的文件都存储在不同的分支中。以便我可以将其添加到Dockerfile中: RUN git clone -b 'version_2.0' --single-branch --depth 1 https://...g

我的服务在运行时需要一些大文件(~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
链接获取它们

这些大文件是某些深层网络的权重

编辑-问题是在docker中存储大文件的合理方式是什么,这样一个开发人员/团队就可以更改文件和匹配的代码,并且它将被记录(git),并且可以很容易地被另一个团队使用甚至部署(出于这个原因,本地PC上的大文件不好,因为它需要发送给另一个团队)

这些文件可能会偶尔更改,我不介意重建容器并在发生更改时重新部署它

那么源代码控制就不是最适合这种工件的

二进制工件存储服务,如or(两者都有免费版本,如果您需要,它们都有自己的docker映像)更适合此任务

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

请参见此处了解。

如果您有一个私有docker注册表,您可以使用已包含的文件构建基本映像。然后,在服务的Dockerfile中,有指向该基本映像的FROM指令

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


使用这种方法,您将原始文件保存在何处并不相关,因为它们在构建基础映像时只使用一次。

我觉得我一定是误读了您的问题,因为答案对我来说似乎是显而易见的,但其他受访者都没有提及。 所以,如果我对你的问题有很大的误解,请原谅我

如果您的服务在运行时需要大文件,并且这些文件会不时更改,那么

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

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

下载新图像也将下载最后一层


至于重新部署,您需要确保所有数据(配置、tmp等)都存储在一个卷中。“重新部署”然后可以使用
docker运行--卷=旧容器…<代码>,立即可用。

如果你正在考虑Dropbox,你为什么不考虑AWS S3?或者您可以将它们装载到某个卷或文件系统中

这实际上取决于您如何构建容器,例如,我们使用Jenkins&fabric8 io插件作为maven构建的一部分来构建容器。我们使用ADD和远程源url(Nexus)

通常,您可以使用URL作为源。因此,这取决于您可以访问哪个存储。 1.您可以创建s3 bucket并提供对docker builder节点的访问。您可以添加
addhttp://example.com/big.tar.xz /要构建的docker文件中的usr/src/things/

  • 您可以将大型文件上载到工件库(如Nexus或Artifactory)中,并在ADD中使用它

  • 如果您正在使用Jenkins进行构建,请在同一主机中创建一个文件夹并配置Web服务器,以便使用virtualhost配置为该内容提供服务。然后使用该Url

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

    卷作为单独的节点存在,并在团队之间共享 作为补充,我建议您在具体案例中使用

    这些会有什么帮助? 正如您所说,有多个团队,每个团队可以运行一个,简单来说就是一组容器及其交互规范(如启动、传递数据等)。换句话说,它是多个容器之间的逻辑连接。 这种吊舱通常在集群上运行,并由Kubernetes的引擎管理

    持久卷是群集中包含数据的另一种资源。与常规卷相比,这些卷在集群中重新编码,可以通过指定PersistentVolumeClaims由不同的POD访问

    使用此方法,您可以:
    • 容器的停机时间为零(在容器中复制吊舱) 集群(根据需要)
    • 由团队中的任何人(或团队的子集)更新网络的权重
    • 在不使用容器的情况下从吊舱获取重量更新

    在我看来,这种方法比每次数据更改时仅重建容器更具长期性。

    我会尝试使用rsync,rsync可以通过ssh正常工作,只复制已更改的部分文件,因此非常有效,您可以在必要时复制文件。而不是每次修改Dockerfile,您可以使用
    docker build--build arg VERSION=“VERSION_2.0”…
    。由于Dockerfile
    ARG VERSION
    指令,Dockerfile可以作为环境变量获取
    $VERSION
    。我只需要提到,这种使用是不被鼓励的:这不是Docker的理念(一个特定的Dockerfile应该总是构建同一个堆栈,它不是像Vagrant这样的provisioner),以及该指令