适用于Gitlab的Global Maven存储库在docker容器中构建

时间:2019-01-13 19:22:57

标签: maven docker gitlab

我正在docker容器中运行Gitlab安装。构建本身也在docker容器中运行。当我主要构建Maven工件时,需要为每个构建下载依赖项,这会产生大量带宽。我至少可以使用提供的缓存来减少相同工件的构建,但这仅适用于连续构建。

是否有一种方法可以在Gitlab安装之外维护所有构建容器都可以访问的全局Maven存储库,因此依赖项只需要下载一次?

2 个答案:

答案 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 Andersencomments中指出的那样,如果多个构建容器并行运行(如Maven拥有.m2目录的所有权),则上述建议可能会导致问题。在这种情况下,最好将构建容器配置为使用在单独容器中运行的工件存储库管理器(例如Nexus)。然后,Nexus容器可以挂载存储库表单磁盘,以便将其从容器的生命周期中分离出来。