我的服务在运行时需要一些大文件(〜100MB-500MB) 这些文件可能在一段时间换一次,我不介意重建我的容器中,当它发生时重新部署它。
我想知道什么是在构建期间存储和使用它的最佳方法,以便团队中的任何人都可以更新容器并重新构建它。
到目前为止,我最好的主意是将这些大文件存储在git LFS中的每个版本的不同分支中。这样我就可以将其添加到我的Dockerfile中:
RUN git clone -b 'version_2.0' --single-branch --depth 1 https://...git.git
此方式,如果这些大型文件的变化,我只需要改变version_2.0
在Dockerfile,和重建。
还有其他推荐方法吗?我考虑过将这些文件存储在Dropbox中,并在构建过程中使用wget
通过链接获得它们
P.S-这些大文件是某些深度网络的权重
编辑 - 现在的问题是怎样一种合理的方式大的文件存储在一个码头工人,这样一个开发者/团队可以改变文件和匹配代码,它会被记录在案(GIT),并可以很容易地使用,甚至部署其他团队(因为这个原因,在本地PC IR坏只是大文件,因为它需要被发送到另一支球队)
答案 0 :(得分:8)
这些文件有时可能会更改一次,我不介意重建容器并在发生容器时重新部署它。
然后源控件不是最适合此类工件的
一种二进制工件存储服务,例如Nexus或Artifactory(它们都有免费版本,并且如果需要则有自己的docker映像)更适合此任务。
从那里,您的Dockerfile可以从Nexus / Artifactory提取您的大文件。
参见proper caching and cache invalidation。
答案 1 :(得分:4)
我认为我一定是在误解您的问题,因为答案对我来说似乎是显而易见的,但其他受访者中都没有提到。 因此,如果我对您的问题有很大的误解,请原谅我。
如果您的服务在运行时需要大文件并且不时更改,则
答案 2 :(得分:2)
这实际上取决于您如何构建容器,例如,作为maven构建的一部分,我们使用Jenkins&fabric8 io插件构建了容器。我们使用带有远程源URL(Nexus)的ADD。
通常,您可以将URL用作源。因此,这取决于您有权访问哪个存储。
1.您可以创建一个s3存储桶,并提供对docker builder节点的访问。您可以在您的docker文件中添加ADD http://example.com/big.tar.xz /usr/src/things/
进行构建
您可以将大文件上传到工件存储库(例如Nexus或Artifactory)中,并在ADD中使用
如果要使用Jenkins进行构建,请在同一主机中创建一个文件夹,并配置Web服务器以使用virtualhost配置提供该内容。然后使用该网址。
最优解决方案将是在不降低安全性的前提下,在工作量和成本方面更便宜的解决方案。
答案 3 :(得分:1)
仅需补充@emory's answer,我建议您为实际情况使用Kubernetes' Persistent Volumes。
正如您所说,有多个团队,每个团队可以运行一个POD,简单来说,这是一组容器及其交互方式(例如开始,传递数据等)。换句话说,这是多个容器之间的逻辑连接。 这种POD通常在集群上运行,并由Kubernetes的引擎进行管理。
永久卷是群集中包含数据的另一资源。与常规卷相比,这些卷位于群集中,并且可以通过指定 PersistentVolumeClaims 来由不同的POD访问。
与每次更改数据时仅重新构建容器相比,IMO这种方法的长期可持续性更高。
答案 4 :(得分:0)
如果您有一个私人Docker注册表,则可以使用已包含的文件构建基本映像。然后在服务的Dockerfile中有FROM指令指向该基本映像。
然后,当其他团队成员想要更新时,他们只需更新Dockerfile上的 FROM 指令即可。
使用这种方法,保留原始文件的位置无关紧要,因为在构建基础映像时它们仅使用一次。
答案 5 :(得分:0)
如果确保使这些文件是构建映像的最后一步(或最后一步),则该构建可以利用以前版本中的缓存。唯一要重建的是包含大文件的层(及其后的所有步骤)。
下载该新图像也会下载最后一层。
对于重新部署,您需要确保所有数据(配置,tmp,...)都存储在卷中。然后,“重新部署”可以使用docker run ... --volumes-from=old-container ...
并立即重新可用。
答案 6 :(得分:0)
如果您甚至考虑使用Dropbox,为什么不考虑使用AWS S3?或者,您可以将它们安装在某些卷或文件系统中。