我正在docker容器中运行Gitlab安装。构建本身也在docker容器中运行。当我主要构建Maven工件时,需要为每个构建下载依赖项,这会产生大量带宽。我至少可以使用提供的缓存来减少相同工件的构建,但这仅适用于连续构建。
是否有一种方法可以在Gitlab安装之外维护所有构建容器都可以访问的全局Maven存储库,因此依赖项只需要下载一次?
答案 0 :(得分:1)
我建议运行一个内部Maven存储库服务器,并告诉您的dockerized Maven构建使用该服务器。存在几种,我发现Nexus可以很好地满足我们的需求(Maven Central和内部存储库的合并视图),并且可以轻松地从
开始docker run -p 8081:8081 --name nexus sonatype/nexus3
然后您可以在Docker化的Maven构建中拥有一个非常简单的settings.xml文件:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>local-nexus</id>
<name>Local Nexus</name>
<!-- Host external IP number -->
<url>http://172.17.0.1:8081/repository/central/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<!-- applied to the image we were using, may not apply to yours -->
<localRepository>/usr/share/maven/ref/repository</localRepository>
</settings>
我相信172.17.0.1 IP地址是Docker在该设置中首次分配的。对于精心设计的版本,它很可能会有真实姓名。
您仍将下载一半的Internet,但在完全填充后仅从内部存储库下载。
答案 1 :(得分:0)
您可以让高速缓存驻留在主机上的容器外部,并将其作为volume装入需要它们的容器中。对于构建容器,只需将保存缓存的主机文件夹安装到需要进行maven缓存的容器(通常为/home/<user>/.m2/repository
)
例如,要将/path/on/host
从主机安装到容器内的/path/in/container
中,请使用以下命令:
docker run -v /path/to/host/folder:/path/in/container buildImage:latest
您希望缓存在构建容器之外,因为您希望在构建之间重用缓存。
编辑:正如Thorbjørn Ravn Andersen在comments中指出的那样,如果多个构建容器并行运行(如Maven拥有.m2目录的所有权),则上述建议可能会导致问题。在这种情况下,最好将构建容器配置为使用在单独容器中运行的工件存储库管理器(例如Nexus)。然后,Nexus容器可以挂载存储库表单磁盘,以便将其从容器的生命周期中分离出来。