docker容器内Gitlab构建的全局Maven存储库

docker容器内Gitlab构建的全局Maven存储库,maven,docker,gitlab,Maven,Docker,Gitlab,我正在docker容器中运行Gitlab安装。构建本身也在docker容器中运行。由于我主要构建Maven构件,每个构建都需要下载依赖项,这会产生大量带宽。至少对于使用提供的缓存的相同工件的构建,我能够减少这种情况,但这只适用于连续构建 有没有办法在Gitlab安装之外维护一个全局maven存储库,所有构建容器都可以访问该存储库,因此依赖项只需下载一次?您可以让缓存位于主机上的容器之外,并将其作为一个组件装载到需要它们的容器中。对于构建容器,只需将保存缓存的主机文件夹装载到需要maven缓存的容

我正在docker容器中运行Gitlab安装。构建本身也在docker容器中运行。由于我主要构建Maven构件,每个构建都需要下载依赖项,这会产生大量带宽。至少对于使用提供的缓存的相同工件的构建,我能够减少这种情况,但这只适用于连续构建


有没有办法在Gitlab安装之外维护一个全局maven存储库,所有构建容器都可以访问该存储库,因此依赖项只需下载一次?

您可以让缓存位于主机上的容器之外,并将其作为一个组件装载到需要它们的容器中。对于构建容器,只需将保存缓存的主机文件夹装载到需要maven缓存的容器中(通常
/home/.m2/repository

例如,要将主机中的
/path/on/host
装入容器中的
/path/in/container
,请使用以下命令:

docker run -v /path/to/host/folder:/path/in/container buildImage:latest 
缓存需要位于生成容器之外,因为您希望在生成之间重用它


编辑:正如在文章中指出的,如果Maven拥有.m2目录的所有权,多个构建容器并行运行,那么上述建议可能会导致问题。在这种情况下,最好将构建容器配置为使用工件存储库管理器,如运行在单独容器中的Nexus。然后,Nexus容器可以挂载存储库表单磁盘,以便将其从容器的生命周期中分离出来。

我建议运行一个内部Maven存储库服务器,并告诉停靠的Maven构建使用该服务器。我发现Nexus可以很好地满足我们的需求(Maven Central的合并视图和内部存储库),并且可以很容易地开始使用

docker run -p 8081:8081 --name nexus sonatype/nexus3
然后,在Docked 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>

局部联系
局部联系
http://172.17.0.1:8081/repository/central/
中心的
/usr/share/maven/ref/repository
我相信172.17.0.1 IP号码是Docker在该设置中分配的第一个IP号码。对于编排的构建,它很可能具有真实名称


您仍将下载一半的internet,但在完全填充后仅从内部存储库下载。

您可以在长期运行的docker实例中使用nexus,并将其告知Maven docker。不要将其用作.m2。Maven希望拥有这个目录,所以不应该共享它以避免竞争条件。您可以将其用作只读文件存储库this@Thorbjørnravandersen只读本地maven存储库如何更新其依赖项?@danielorn我不确定您是否可以通过gitlab为构建配置docker容器,但是仔细研究一下。@svenkubiak您可以拥有一个预填充的本地文件存储库,本地maven实例可以从中提取。它仍然需要自己的.m2/repository文件夹来存储工件;缓存的和下载的(您希望avodi)都有专门的Nexus安装,这似乎有点言过其实,但它似乎是可行的。退出服务器并直接再次进入不会增加服务器的网络流量。谢谢@svenkubiak嗯,可能存在更简单的解决方案,但这正是Maven架构师希望我们做的。总的来说,我发现从长远来看,将决策和配置移出Maven客户端(比如要求Nexus提供上游存储库的合并视图)是最好的解决方案。