我们有一个docker映像,该映像针对特定的存储库运行git clone命令,然后运行maven build。在本地运行此映像时,它可以正常工作。在AWS VM中运行此映像时,它可以正常工作。
我们遇到的问题是,当我们在ACI(Azure容器实例)中或Azure VM上运行此映像时,maven构建中的下载工件步骤存在一些连接问题-jar下载非常慢(有时) )-甚至超时(有时)。
我们参数化了使用此映像构建的存储库-超时问题仅在少数项目中发生。据我们所知,这些项目没有什么特别的。
对于我们实际运行的vm和mvn命令的特定配置-连接问题发生在同一组工件上。
如果我们更改mvn命令-发生连接问题的位置也会更改。
最初,我们在git clone之后执行了一个mvn clean package
命令-这在一组特定的jar上产生了问题。
然后,我们添加了mvn dependency:resolve-plugins
,mvn compile dependency:resolve
,最后添加了mvn clean package
。
这样做是因为我们认为最初运行的某些测试可能会导致连接问题-因此,我们首先移动了人工产品下载步骤。这并不能解决问题-只是更改了jar下载冻结的位置。
更改了mvn线程计数配置以及VM内核和内存大小-但这无济于事。
我们在VM上设置了TCP Keepalive标志-以避免可能的Azure NAT /负载均衡器超时杀死我们的连接。 这是Azure支持人员建议的解决方案,我们也在以下位置找到了它: Maven build gets connection reset when downloading artifacts 我们根据azure指南对其进行了配置: https://github.com/wbuchwalter/azure-content/blob/master/includes/guidance-tcp-session-timeout-include.md
> sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 20
这是mvn日志的示例:
14:10:48,505 [BasicRepositoryConnector-repo.maven.apache.org-27-0] [INFO] Downloading from central: https://repo.maven.apache.org/maven2/regexp/regexp/1.3/regexp-1.3.jar
14:10:48,506 [BasicRepositoryConnector-repo.maven.apache.org-27-2] [INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/scm/maven-scm-provider-cvs-commons/1.7/maven-scm-provider-cvs-commons-1.7.jar
14:10:48,505 [BasicRepositoryConnector-repo.maven.apache.org-27-1] [INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/scm/maven-scm-provider-git-commons/1.7/maven-scm-provider-git-commons-1.7.jar
14:10:48,521 [BasicRepositoryConnector-repo.maven.apache.org-27-3] [INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/tmatesoft/sqljet/sqljet/1.0.4/sqljet-1.0.4.jar
14:10:48,523 [BasicRepositoryConnector-repo.maven.apache.org-27-4] [INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/antlr/antlr-runtime/3.1.3/antlr-runtime-3.1.3.jar
14:10:48,540 [BasicRepositoryConnector-repo.maven.apache.org-27-0] [INFO] Downloaded from central: https://repo.maven.apache.org/maven2/regexp/regexp/1.3/regexp-1.3.jar (25 kB at 706 kB/s)
14:10:48,540 [BasicRepositoryConnector-repo.maven.apache.org-27-0] [INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/antlr/stringtemplate/3.2/stringtemplate-3.2.jar
14:10:48,564 [BasicRepositoryConnector-repo.maven.apache.org-27-0] [INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/antlr/stringtemplate/3.2/stringtemplate-3.2.jar (172 kB at 4.0 MB/s)
14:26:32,150 [BasicRepositoryConnector-repo.maven.apache.org-27-2] [INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/scm/maven-scm-provider-cvs-commons/1.7/maven-scm-provider-cvs-commons-1.7.jar (80 kB at 84 B/s)
14:26:32,157 [BasicRepositoryConnector-repo.maven.apache.org-27-4] [INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/antlr/antlr-runtime/3.1.3/antlr-runtime-3.1.3.jar (151 kB at 159 B/s)
14:26:32,199 [BasicRepositoryConnector-repo.maven.apache.org-27-3] [INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/tmatesoft/sqljet/sqljet/1.0.4/sqljet-1.0.4.jar (744 kB at 788 B/s)
通知可疑者:(151 kB在159 B / s时),(80 kB在84 B / s时),(744 kB在788 B / s时)
我们有一些运行良好的示例-超时(1小时)的示例-耗时接近1h的示例。
解决方案:
我们有一些选项可以将某些jar预先缓存在初始docker映像中-因此不需要maven来处理它们。但是处理此构建的docker映像需要为任何git repo(Java + Maven)运行,并且我们不知道这些项目有什么依赖关系。
与另一点类似,可以选择创建一个在运行中的容器之间共享的外部卷,并在其中缓存jar。
我们有一个选择,可以在Maven构建失败后重新启动它-因为部分依赖项已经被下载,并且不会卡在同一位置。
我们寻求Azure支持,他们推荐了TCP Keep-alive配置-但这不能解决我们的问题。
我们想了解问题的根本原因-是docker配置吗?它是Maven错误吗?是天蓝色的特定问题吗? 连接问题大约发生9/10次执行-我不知道为什么它起作用-也没有想法为什么它不起作用:) 我之前提到的解决方案只是变通方法-它们不能解决-可以忽略它。