我的服务在运行时需要一些大文件(~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
获取链接
P.S - 这些大文件是某些Deep-Network的权重
编辑 - 问题是在docker中存储大文件的合理方式,这样一个开发人员/团队可以更改文件和匹配代码,并且会记录(git)并且可以轻松地使用,甚至可以由其他团队部署(因此,只是本地PC上的大文件坏了,因为它需要发送给另一个团队)
它实际上归结为你如何构建容器,例如我们使用Jenkins和fabric8 io插件构建我们的容器作为maven构建的一部分。我们将ADD与远程源URL(Nexus)一起使用。
通常,您可以使用URL作为源。所以它取决于您可以访问哪个存储。 1.您可以创建一个s3存储桶并提供对docker builder节点的访问。您可以在docker文件中添加ADD http://example.com/big.tar.xz /usr/src/things/
来构建
最佳解决方案是在努力和成本方面更便宜而不影响安全性。
这些文件可能会偶尔发生变化,我不介意重建我的容器并在发生时重新部署它。
然后源控件不是最适合这种工件。
二进制工件存储服务,如Nexus或Artifactory(两者都有自由版本,并且如果需要的话,它们都有自己的docker镜像)更适合这项任务。
从那里,您的Dockerfile可以从Nexus / Artifactory中获取您的大文件。 在这里查看proper caching and cache invalidation。
我觉得我一定是在误解你的问题,因为答案对我来说显得非常明显,但其他受访者都没有提到它。如果我误解你的问题,请原谅我。
如果您的服务在运行时需要大文件,并且它们会不时更改,那么
只是为了补充@emory's answer,我建议你使用Kubernetes' Persistent Volumes为你的确切情况。
正如你所说,有多个团队,每个团队可能运行一个POD,简单来说就是一组容器和他们交互的规范(如启动,传递数据等)。换句话说,它是多个容器之间的逻辑连接。此类POD通常在群集上运行,并由Kubernetes的引擎管理。
持久卷是包含数据的群集中的另一个资源。与常规卷相比,它们在群集中重新发送,并且可以通过指定PersistentVolumeClaims由不同的POD访问。
IMO这种方法比每次更改数据时仅重建容器更具可持续性。
如果您有私有docker注册表,则可以使用已包含的文件构建基本映像。然后在您的服务的Dockerfile中有FROM指令指向该基本映像。
然后,当其他团队成员想要更新时,他们只需更新Dockerfile上的FROM指令。
使用此方法与保留原始文件的位置无关,因为在构建基本映像时它们仅使用一次。
如果确保使这些文件成为构建映像的最后一步(或最后一步),则构建可以使用先前版本的缓存。唯一要重建的是包含大文件的层(以及之后的任何步骤)。
下载新图像也将只下载最后一层。
至于重新部署,您需要确保所有数据(configs,tmp,...)都存储在卷中。然后“重新部署”可以使用docker run ... --volumes-from=old-container ...
并立即再次使用。
如果您正在考虑使用Dropbox,为什么不考虑AWS S3?或者您可以将它们安装在某个卷或文件系统中。