![](/img/trans.png)
[英]Is it possible to use a local Docker image in a docker-compose file for DockerComposeContainer?
[英]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>
我应该如何处理? 我看到两种情况。
如何获得主机的可靠名称? 需要Linux,其他平台也不错。
我如何让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 --rm
和depends_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.