極力推薦:一個(gè)Docker的maven插件
什么是Docker
Docker最近在業(yè)內(nèi)非常火。如果你現(xiàn)在還不知道Docker是什么,你可要小心嘍。今后,你會(huì)發(fā)現(xiàn)自己正在以某種方式使用它。本文假設(shè)你已經(jīng)有了Docker的基礎(chǔ)。如果你現(xiàn)在對(duì)它還不是很熟悉,我確定你以后還會(huì)來讀這篇文章。
Docker用于集成測(cè)試、復(fù)雜分布式系統(tǒng)演示,非常理想。甚至可以用于運(yùn)行生產(chǎn)環(huán)境下的系統(tǒng)。它是一個(gè)開源的軟件容器。你可以把它想像成一個(gè)非常輕的超級(jí)快的虛擬機(jī)。
例子
得到“Integration testing with Maven and Docker”文章和Docker Java API項(xiàng)目的啟發(fā),我寫了一個(gè)簡(jiǎn)單的可以管理Docker容器maven插件,Docker Maven Plugin。這個(gè)插件將會(huì)根據(jù)你的配置,在構(gòu)建時(shí)啟動(dòng)容器,構(gòu)建結(jié)束時(shí)停止容器并刪除,如果本地找不到鏡像,Docker會(huì)自動(dòng)去中央倉庫下載。
以下與Apache Camel的集成測(cè)試是被忽略的,因?yàn)闇y(cè)試需要一個(gè)Redis實(shí)例才可以執(zhí)行:
- package org.apache.camel.component.redis;
- import org.apache.camel.impl.JndiRegistry;
- import org.junit.Ignore;
- import org.junit.Test;
- import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
- import org.springframework.data.redis.core.RedisTemplate;
- @Ignore
- public class RedisProducerIntegrationTest extends RedisTestSupport {
- private static final JedisConnectionFactory CONNECTION_FACTORY = new JedisConnectionFactory();
- static {
- CONNECTION_FACTORY.afterPropertiesSet();
- }
- @Override
- protected JndiRegistry createRegistry() throws Exception {
- JndiRegistry registry = super.createRegistry();
- redisTemplate = new RedisTemplate();
- redisTemplate.setConnectionFactory(CONNECTION_FACTORY);
- redisTemplate.afterPropertiesSet();
- registry.bind("redisTemplate", redisTemplate);
- return registry;
- }
- @Test
- public void shouldSetAString() throws Exception {
- sendHeaders(
- RedisConstants.COMMAND, "SET",
- RedisConstants.KEY, "key1",
- RedisConstants.VALUE, "value");
- assertEquals("value", redisTemplate.opsForValue().get("key1"));
- }
- @Test
- public void shouldGetAString() throws Exception {
- redisTemplate.opsForValue().set("key2", "value");
- Object result = sendHeaders(RedisConstants.KEY, "key2", RedisConstants.COMMAND, "GET");
- assertEquals("value", result);
- }
- }
我們配置docker-maven-plugin使用一個(gè)Redis鏡像同時(shí)讓主機(jī)的6379端口映射到容器的6379端口:
- <plugin>
- <groupId>com.ofbizian</groupId>
- <artifactId>docker-maven-plugin</artifactId>
- <version>1.0.0</version>
- <configuration>
- <images>
- <image>
- <name>dockerfile/redis</name>
- <hostConfig>
- <![CDATA[
- {
- "PortBindings": {
- "6379/tcp": [
- {
- "HostIp": "0.0.0.0",
- "HostPort": "6379"
- }
- ]
- }
- }
- ]]>
- </hostConfig>
- </image>
- </images>
- </configuration>
- <executions>
- <execution>
- <id>start-docker</id>
- <phase>pre-integration-test</phase>
- <goals>
- <goal>start</goal>
- </goals>
- </execution>
- <execution>
- <id>stop-docker</id>
- <phase>post-integration-test</phase>
- <goals>
- <goal>stop</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
插件在編譯期啟動(dòng)一個(gè)Docker容器,然后在集成測(cè)試結(jié)束期關(guān)閉容器。
這是一個(gè)非常簡(jiǎn)單的例子,但是這個(gè)插件支持更多的場(chǎng)景,如多鏡像不同配置;將啟動(dòng)/關(guān)閉容器動(dòng)作定義在不同的maven構(gòu)建期間。Enjoy.
原文鏈接:http://my.oschina.net/u/181141/blog/215524