繁体   English   中英

如何在docker-compose中可靠地使用本地Maven镜像代理?

[英]How to reliably use a local Maven mirroring proxy with docker-compose?

我正在努力将我们现有的Java项目的Maven构建过程迁移到Docker中。 我是使用Maven的经验丰富的Java开发人员,但仍在学习Docker。

我们的主要问题是,默认情况下不会缓存工件,因此我们每五分钟下载一半的Internet,再加上在本地的老式Nexus服务器上也有东西。 因为这是用于自动化集成测试,所以我们不想在docker之外构建构件。

经过仔细考虑,我发现一个好的解决方案可能是为每个开发人员运行一个Maven镜像代理,以保留本地配置,然后引用Docker实例。 使用以下命令手动运行Nexus3容器

docker run -p 8081:8081 --name nexus sonatype/nexus3

到目前为止(加上一些手动配置来代理我们的内部存储库)到目前为止运行良好,但不受docker-compose的控制。

不幸的是,除了对机器的外部IP编号进行硬编码之外,我看不到其他方式来宾访问主机(可使用端口8081的主机),并且我看不到任何方式使docker-compose负责确保nexus容器当我的docker构建需要它时,它正在运行。

我目前正在使用它作为docker中的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://1.2.3.4:8081/repository/sbforge_central/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
    <localRepository>/usr/share/maven/ref/repository</localRepository>
</settings>

我应该如何处理? 我看到两种情况。

  1. 如何获得主机的可靠名称? 需要Linux,其他平台也不错。

  2. 我如何让docker-compose控制此容器,以便在运行docker-compose build时将其启动,以便docker可以确保nexus容器的主机名能够解析? 提起完成的容器时不需要。

还是有更聪明的方法?

希望我没错,但是我看到了以下解决您的问题的选项:

1. [更新]在settings.xml中使用env参数
您能否在docker-compose.yml使用环境变量并将其设置在settings.xml中: ${env.EXTERNAL_NEXUS_HOST}

2. Nexus依赖性

docker-compose build不允许您设置其他服务的条件,但是您可以使用docker-compose run --rmdepends_on

version: '2'
services:
  # Whatever this might look like, it's just an example
  mvn:
    image: mvn
    depends_on:
      - nexus
    command: mvn deploy
  nexus:
    image: sonatype/nexus3

那解决了什么还是我弄错了?

根据https://stackoverflow.com/users/4527948/asger-askov-blekinge的离线建议,在docker-compose控制的网络中,主机的默认网络地址为172.17.0.1。 建议对maven:3-jdk-9-slim映像使用pom.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>
            <url>http://172.17.0.1:8081/repository/maven_central/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
    <localRepository>/usr/share/maven/ref/repository</localRepository>
</settings>

这对于我们进行非部署构建时最有用,因为我们可以在Nexus中轻松地将内部存储库与Maven Central合并,从而将复杂性移到构建之外。

不是答案,但是评论不允许这样大小的评论:

也许我在这里误解了一点:但是,“我是一个经验丰富的Maven开发人员”是什么意思?您是否开发了Maven插件等?或者您是使用Maven的Java开发人员?您是通过Maven构建的吗?是否删除了每个构建的本地缓存?以前是否使用过存储库管理器?为什么不愿意在Docker之外构建工件?您是否在使用像Jenkins这样的CI服务器?为什么使用存储库管理器在Docker中但未为存储库数据装载卷?与Docker-Compose的关系在哪里?除了docker-compose并不负责保持服务的可用性和可用性...

settings.xml的配置看起来像您以某种方式共享本地缓存? 我希望你不要这样做...这将无法工作...

更新:

正如我之前问过的,为什么需要在Docker容器中构建? 它比外部慢得多,最好是将CI服务器用于此类目的。... docker-compose不能真正协调事情,因为它不能确保服务已启动并正在运行(这必须由您自己的服务处理) )

此外,您无法提取本地缓存空间,因为您需要它来构建jar / war / ear的...(顺便说一句:我现在与Docker合作大约2年;与Maven合作大约10年;我Apache Maven PMC成员)...

关键是您必须将Docker容器的本地缓存映射到在删除Container之后不会删除的卷上。因此,每次启动“ Build Container”时,都必须将该卷分配给Container。 。否则,在您停止容器后,该容器将被删除(容器内的本地缓存),这对于Nexus3容器也是如此...您还必须将一个卷映射到Nexus3容器中,否则代理想法就被粉碎了... 。

关于停靠组合的想法。 如果您定义诸如depends_on nexus类的东西,它将在Maven执行之前启动Nexus3容器,但不会真正等到Nexus3真正可用。(大约需要2-3分钟)...所以最终操作将无法正常进行(通常是因为编译速度超过2-3分钟)...因此,您必须在单独的区域(例如在Mesos的环境中)启动Nexus3容器,该区域始终在运行,这对您的生命至关重要支持Maven构建的基础架构...我也建议您开始使用jenkins等CI解决方案来处理所有构建...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM