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

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

什么是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

 

责任编辑:林师授 来源: OSCHINA
相关推荐

2014-03-21 09:44:08

MAC PHPMAC JS

2017-09-04 09:13:45

技术大牛秘诀

2023-09-28 21:22:10

2017-08-23 09:53:49

IT架构师知识图谱

2021-07-06 05:36:52

VS code插件编程

2023-12-13 08:24:42

maven插件自动化

2017-09-05 16:27:28

GitHub

2020-09-28 15:55:32

开源技术 工具

2017-09-01 13:00:23

Chrome浏览器插件

2011-07-06 13:38:42

Web

2009-09-17 08:48:54

CCNA教材教程CCNA

2023-08-18 14:39:20

RCS谷歌

2009-09-03 11:17:01

PHP问卷调查系统

2016-03-08 09:52:22

xcode插件开发

2022-05-12 08:04:50

Docker镜像Python

2022-12-05 08:55:39

MavenGradle项目

2009-09-14 10:23:59

CCNA自学教材

2011-11-25 09:09:22

jQuery

2022-09-28 10:35:31

JavaScript代码内存泄漏

2024-07-19 10:31:15

点赞
收藏

51CTO技术栈公众号