如何制作和使用Maven的Docker镜像

当使用GitLab CI的流水线功能时,可能需要新增项目打包的阶段,此时就要用到Maven或Gradle进行打包。本文将介绍如何以GitLab Runner的镜像为基础,构建集成Maven功能的Docker镜像,然后再简单介绍如何启动和使用Maven容器。

一、环境描述

1. 虚拟机配置

  • CPU:单核
  • 内存:2 GB
  • 硬盘:120 GB
  • IP:192.168.190.128

2. 操作系统

  • 版本:CentOS 7.4 x86_64 (1708)
  • 安装方式:Minimal

3. Docker

4. GitLab服务器

5. GitLab Runner

二、构建镜像

1. 创建Dockerfile文件

在shell中运行以下命令:

cd /root/Downloads
vi Dockerfile

Dockerfile的内容,如下所示:

# 使用自建的GitLab Runner镜像
FROM registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/gitlab-runner:10.5.0

# 镜像维护者
MAINTAINER ghoulich@aliyun.com

# 安装wget
RUN yum install -y wget

# 安装Maven
RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
RUN yum -y install apache-maven

# 清理系统
RUN yum clean all

每个构建步骤的用途,都在注释中有所说明,本文不再赘述。

2. 构建镜像

在shell中运行以下命令:

docker build -t gitlab-maven-runner:3.5.2 .

构建完成之后,查看新建Docker镜像的信息,如下图所示:

查看Maven镜像的状态

3. 上传镜像

本文将Docker镜像交给阿里云托管,在shell中运行以下命令,上传镜像:

# 登录阿里云镜像库
docker login --username=ghoulich@aliyun.com registry.cn-hangzhou.aliyuncs.com
# 为本地镜像创建标签
docker tag gitlab-maven-runner:3.5.2 registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/gitlab-maven-runner:3.5.2
# 推送镜像
docker push registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/gitlab-maven-runner:3.5.2

请根据实际情况,修改上述命令中的用户名和仓库名。

三、启动package-runner容器

在shell中运行以下命令,启动一个专用于打包的容器:

mkdir -p /usr/local/gitlab-runner/data
mkdir -p /usr/local/gitlab-runner/config/package
docker run --detach \
    --name package-runner \
    --hostname package-runner \
    --restart always \
    --volume /usr/local/gitlab-runner/config/package:/etc/gitlab-runner \
    --volume /usr/local/gitlab-runner/data:/home/gitlab-runner \
    --env JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64 \
    registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/gitlab-maven-runner:3.5.2

上述命令将容器的名称设置为package-runner,将容器的配置文件目录/etc/gitlab-runner挂载至宿主机的/usr/local/gitlab-runner/config/package目录,将容器的数据目录/home/gitlab-runner挂载至宿主机的/usr/local/gitlab-runner/dat目录。

四、注册Runner实例

GitLab Runner容器启动之后,必须去GitLab服务器进行注册,然后才能在流水线中使用。注册过程,如下图所示:

注册Package Runner

注册Runner需要填写以下信息:

  • GitLab服务器的URL,本文设置为http://10.15.1.248/
  • GitLab的注册令牌,通常能在GitLab的项目管理页面或系统配置页面找到,本文设置为pDXW_tssA5NHa5K4zSY-
  • 待注册Runner的描述,本文设置为package-runner
  • 待注册Runner的标签,可以设置多个标签(以逗号分割),本文设置为maven
  • 是否运行未打标签的构建任务,本文设置为false
  • 是否将待注册的Runner锁定至当前项目,本文设置为false
  • 执行器的类型,本文设置为shell

请根据实际情况填写上述注册信息。如果注册成功,那么可以在GitLab服务器的Runner配置页面中看到刚刚注册的GitLab Runner,如下图所示:

查看Package Runner的注册状态

五、手动打包项目

接下来,本文尝试利用package-runner容器手动打包maven项目,检查该容器是否能够正常工作。假设GitLab服务器上有一个名为demo的项目,通过git工具拉取代码:

docker exec -it package-runner git clone http://10.15.1.248/yangbin/demo.git /home/gitlab-runner/demo

在shell中运行以下命令,手动打包demo项目:

docker exec -it package-runner mvn clean package -DskipTests -f /home/gitlab-runner/demo

经过漫长的等待,打包完成之后,运行得到的jar包,检查是否打包成功:

# 启动demo项目
docker exec --detach package-runner java -jar /home/gitlab-runner/demo/target/demo-0.0.1-SNAPSHOT.jar
# 访问示例服务
docker exec -it package-runner curl http://127.0.0.1:8080/hello

若上述最后一条命令的输出如下图所示,则表示打包成功:

验证Maven容器的打包功能

至此,Maven的Docker镜像已经制作完成了,本文还启动了一个简单的Maven容器,通过一个示例,简单地演示了拉取源码和打包的功能!