1您所在的位置:开发 > 项目&管理 > 极力推荐:一个Docker的maven插件

极力推荐:一个Docker的maven插件

2014-04-03 10:46 翟志军 OSCHINA 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!

一个Docker的maven插件的简单介绍。我只负责搬砖。原文地址:http://www.ofbizian.com/2014/04/a-docker-maven-plugin-for-integration.html

AD:

什么是Docker

Docker最近在业内非常火。如果你现在还不知道Docker是什么,你可要小心喽。今后,你会发现自己正在以某种方式使用它。本文假设你已经有了Docker的基础。如果你现在对它还不是很熟悉,我确定你以后还会来读这篇文章。

Docker用于集成测试、复杂分布式系统演示,非常理想。甚至可以用于运行生产环境下的系统。它是一个开源的软件容器。你可以把它想像成一个非常轻的超级快的虚拟机。

例子

得到“Integration testing with Maven and Docker”文章和Docker Java API项目的启发,我写了一个简单的可以管理Docker容器maven插件,Docker Maven Plugin。这个插件将会根据你的配置,在构建时启动容器,构建结束时停止容器并删除,如果本地找不到镜像,Docker会自动去中央仓库下载。

以下与Apache Camel的集成测试是被忽略的,因为测试需要一个Redis实例才可以执行:

  1. package org.apache.camel.component.redis; 
  2.  
  3.     import org.apache.camel.impl.JndiRegistry; 
  4.     import org.junit.Ignore; 
  5.     import org.junit.Test; 
  6.     import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; 
  7.     import org.springframework.data.redis.core.RedisTemplate; 
  8.  
  9.     @Ignore 
  10.     public class RedisProducerIntegrationTest extends RedisTestSupport { 
  11.         private static final JedisConnectionFactory CONNECTION_FACTORY = new JedisConnectionFactory(); 
  12.  
  13.         static { 
  14.             CONNECTION_FACTORY.afterPropertiesSet(); 
  15.         } 
  16.  
  17.         @Override 
  18.         protected JndiRegistry createRegistry() throws Exception { 
  19.             JndiRegistry registry = super.createRegistry(); 
  20.             redisTemplate = new RedisTemplate(); 
  21.             redisTemplate.setConnectionFactory(CONNECTION_FACTORY); 
  22.             redisTemplate.afterPropertiesSet(); 
  23.  
  24.             registry.bind("redisTemplate", redisTemplate); 
  25.             return registry; 
  26.         } 
  27.  
  28.         @Test 
  29.         public void shouldSetAString() throws Exception { 
  30.             sendHeaders( 
  31.                     RedisConstants.COMMAND, "SET"
  32.                     RedisConstants.KEY, "key1"
  33.                     RedisConstants.VALUE, "value"); 
  34.  
  35.             assertEquals("value", redisTemplate.opsForValue().get("key1")); 
  36.         } 
  37.  
  38.         @Test 
  39.         public void shouldGetAString() throws Exception { 
  40.             redisTemplate.opsForValue().set("key2""value"); 
  41.             Object result = sendHeaders(RedisConstants.KEY, "key2", RedisConstants.COMMAND, "GET"); 
  42.  
  43.             assertEquals("value", result); 
  44.         } 
  45.     } 

我们配置docker-maven-plugin使用一个Redis镜像同时让主机的6379端口映射到容器的6379端口:

  1. <plugin> 
  2.         <groupId>com.ofbizian</groupId> 
  3.         <artifactId>docker-maven-plugin</artifactId> 
  4.         <version>1.0.0</version> 
  5.         <configuration> 
  6.             <images> 
  7.                 <image> 
  8.                     <name>dockerfile/redis</name> 
  9.                     <hostConfig> 
  10.                         <![CDATA[ 
  11.                             { 
  12.                                 "PortBindings": { 
  13.                                     "6379/tcp": [ 
  14.                                         { 
  15.                                             "HostIp": "0.0.0.0", 
  16.                                             "HostPort": "6379" 
  17.                                         } 
  18.                                     ] 
  19.                                 } 
  20.                             } 
  21.                     ]]> 
  22.                     </hostConfig> 
  23.                 </image> 
  24.             </images> 
  25.         </configuration> 
  26.         <executions> 
  27.             <execution> 
  28.                 <id>start-docker</id> 
  29.                 <phase>pre-integration-test</phase> 
  30.                 <goals> 
  31.                     <goal>start</goal> 
  32.                 </goals> 
  33.             </execution> 
  34.             <execution> 
  35.                 <id>stop-docker</id> 
  36.                 <phase>post-integration-test</phase> 
  37.                 <goals> 
  38.                     <goal>stop</goal> 
  39.                 </goals> 
  40.             </execution> 
  41.         </executions> 
  42.     </plugin> 

插件在编译期启动一个Docker容器,然后在集成测试结束期关闭容器。

这是一个非常简单的例子,但是这个插件支持更多的场景,如多镜像不同配置;将启动/关闭容器动作定义在不同的maven构建期间。Enjoy.

原文链接:http://my.oschina.net/u/181141/blog/215524

【编辑推荐】

  1. Docker的搭建Gitlab CI 全过程详解
  2. Docker 和一个正常的虚拟机有何区别?
  3. Docker—Git部署
  4. Docker 简介
  5. Docker如何将错综复杂的Linux代码转成开发者的魔法
【责任编辑:林师授 TEL:(010)68476606】



分享到:

网友评论TOP5

查看所有评论(

提交评论

热点职位

更多>>

热点专题

更多>>

读书

网管员必读——网络基础(第2版)
本书是在《网管员必读—网络基础》(第1版)基础上修改而成的。全书共分9章,分别介绍计算机网络概述(修改)、数制(新增)、网

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院 区块链第一聚合媒体 zhijiapro