jenkins dockerfile maven 自动打包、容器构建、发布_dockerfile mvn打包 运行_菜鸡的挣扎的博客-程序员秘密

技术标签: maven  jenkins  运维/部署  docker  

概述

想着在公司弄一套自动部署测试流程,jenkins + gitee 自动 build 已经测试成功了。

下一步就是 docker + maven + jenkins + git 打包发布了。


dockerfile

dockerfile 可以根据命令定制镜像,用来构建 docker 容器。

语法

注意:dockerfile 命令都必须用大写

  • FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
  • MAINTAINER:维护者,国际惯例:姓名+邮箱。
  • ADD/COPY:两者相似、官方推荐 COPY,将文件复制到容器中。不过 ADD 会自动解压,也蛮不错。
  • RUN:用于执行后面跟着的命令行命令。RUN是构件容器时就运行的命令以及提交运行结果。
  • VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。避免数据丢失、避免容器膨胀。
  • EXPOSE:声明端口。① 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。② 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
  • ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
  • WORKDIR:指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
  • CMD:CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子。如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效
  • ENTRYPOINT :类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
# 基础镜像,在此基础上开始构建
FROM centos

# 维护者信息
MAINTAINER shiva

# 将jar包复制到容器指定目录下
COPY /opt/shiva-test.jar /opt/
ADD /usr/local/java/jdk-8u261-linux-x64.tar.gz /opt/

# 运行命令
RUN yum install wget
RUN tar -xzvf redis.tar.gz

# 虚拟映射,用于持久化存储数据。和挂载 -v 一样。映射地址可以通过 docker inspect ID 查看
VOLUME ["/data", "/var"]

# 暴露 8080、6379 两个端口,创建时按顺序映射端口 docker run -p 12345 -p 54321 image
# 12345:8080,54321:6379
EXPOSE 8080 6379

# 后续就可以用 NODE_VERSION 代替 7.2.0
ENV NODE_VERSION 7.2.0

# 指定工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次
WORKDIR /opt/software

PS:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。命令越少越好。


编写 dockerfile

按需要进行构建,我按自己的需求搞一个,思路大约是:

  1. 基础镜像、维护者信息、设置变量、复制需要的压缩包到容器
  2. 在容器内执行命令,完成环境配置,暴露端口
  3. 构建运行

先准备一个 jar 包,就一个接口,以后 jar 包也会自动生成。

@RestController
public class IndexController {
    
    @RequestMapping(value = "index")
    public String index(){
    
        return "服务正在运行......";
    }
}

编写 dockerfile 文件:

FROM openjdk:8-jdk-alpine
MAINTAINER shiva<[email protected].com>
COPY demo.jar /opt/
EXPOSE 8080
WORKDIR /opt
ENTRYPOINT ["java","-jar","/opt/demo.jar"]

构建运行

当前目录下文件:

[[email protected] software]# ll
total 16720
-rw-r--r-- 1 root root 17102555 Aug 30 09:45 demo.jar
-rw-r--r-- 1 root root      156 Aug 30 13:34 dockerfile

构建镜像:

docker build -f dockerfile -t test/demo:1.0 .

可以在镜像列表中查看 test/demo : 1.0 的镜像,然后启动:

docker run -itd --name=testDemo -p 8081:8080 test/demo:1.0

测试访问,链接正常运行。

build 常用参数如下:

  • –build-arg=[] : 设置镜像创建时的变量;
  • -f : 指定要使用的Dockerfile路径;
  • –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
  • –rm : 设置镜像成功后删除中间容器;

jenkins maven 插件

jenkins 先安装插件: Maven Integration

首先,在全局安全配置中:

  • 取消勾选 Agent → Controller Security,可以防止以下问题。这个问题在生成 Gitee WebHook 密码会出错。
HTTP ERROR 403 No valid crumb was included in the request
  • JDK 和 maven 配本地的,把自动安装取消,应该就知道填什么地址了

构建 maven项目,其他都不写了,和 jenkins npm build 一样,看以前的文章。

Goals and options可以填写下面命令。

clean compile package -Dmaven.test.skip=true

清理、编译、打包,不执行测试用例,也不编译测试用例类。

然后执行构建,测试下。

在我的工程目录 /root/.jenkins/workspace/maven test/ 下,已经生成了 target 文件夹。


全套构建测试

上面两步合在一起就行了。

  1. 在本地编写 dockerfile,和代码一起上传 git
  2. jenkins 拉代码,maven 自动打包
  3. Post Steps 中写构建后 shell 命令,执行 docker 构建、启动运行

dockerfile 要根据实际路径和版本修改:

FROM openjdk:8-jdk-alpine
MAINTAINER shiva<[email protected].com>
COPY target/demo-0.1.jar /opt/
EXPOSE 8080
WORKDIR /opt
ENTRYPOINT ["java","-jar","/opt/demo-0.1.jar"]

构建后 shell 命令也根据实际情况写:

docker build -f dockerfile -t test/demo:1.0 .
docker run -itd --name=testDemo -p 8081:8080 test/demo:1.0

考虑到会多次构建,重复生成镜像,重复创建容器。对命令进行改进:


# 先定义镜像和版本信息
DOCKERNAME='demoTest'
REPOSITORIES='demo/test'
TAG=`date +%Y%m%d-%H%M%S`

# 删除原来的容器
CONTAINER_ID=`docker ps | grep "${DOCKERNAME}" | awk '{print $1}'`
if [ -n "$CONTAINER_ID" ]; then
    docker stop $CONTAINER_ID
    docker rm $CONTAINER_ID
else #如果容器启动时失败了,就需要docker ps -a才能找到那个容器
    CONTAINER_ID=`docker ps -a | grep "${DOCKERNAME}" | awk '{print $1}'`
    if [ -n "$CONTAINER_ID" ]; then  # 如果是第一次在这台机器上拉取运行容器,那么docker ps -a也是找不到这个容器的
        docker rm $CONTAINER_ID
    fi
fi

# 删除原来的镜像
IMAGE_ID=`sudo docker images | grep ${
    REPOSITORIES} | awk '{print $3}'`
if [ -n "${IMAGE_ID}" ];then
    docker rmi ${
    IMAGE_ID}
fi

docker build -f dockerfile -t ${
    REPOSITORIES}:${
    TAG} .
docker run -itd --name=${
    DOCKERNAME} -p 8081:8080 ${
    REPOSITORIES}:${
    TAG}

最后测试,一切顺利。


参考文章

【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

Dockerfile命令详解(超全版本) - 大周说测试 - 博客园 (cnblogs.com)

docker构建jdk1.8镜像_面朝大海,春暖花开-程序员秘密

Docker 构建jdk8 镜像 - 蓝色土耳其 - 博客园 (cnblogs.com)

自动化部署(一)jenkins+github+maven+docker(通过Dockerfile脚本部署项目) - jack-jin - 博客园 (cnblogs.com)

【docker】docker build :镜像_u010900754的专栏-程序员秘密

Dockerfile部署jar_fishinhouse的专栏-程序员秘密_dockerfile jar

jenkins实现maven项目自动化部署tomcat - 夜枫林 - 博客园 (cnblogs.com)

Maven中-DskipTests和-Dmaven.test.skip=true的区别 - 飘飘雪 - 博客园 (cnblogs.com)

Jenkins+Docker持续集成_artaganan8的博客-程序员秘密

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46144826/article/details/120005794

智能推荐

北京联通光猫 F427 路由改桥接的方法_weixin_30950887的博客-程序员秘密

最近安装了一个联通的宽带,赠送的光猫是 中兴 F427,然后联通小哥给安装的时候,直接开启了光猫的路由功能。不过联通这个光猫实在是太弱了,起码默认的帐号开启的功能实在是太弱了,没法完成以下几个功能:端口转发脱机下载最重要的 5G HZ 的 Wifi,这个可以省去很多信号冲突DLNA给联通去电话,接电话的人完全不知道是什么意思,只是说如果你按住路由器只能使...

yolov5 6.0版本->onnx->ncnn +安卓部署 附加ncnn环境配置 保姆级详细教程_ncnn yolov5_xrh_的博客-程序员秘密

Windows下 yolov5 6.0版本转onnx转ncnn +安卓部署 附加ncnn环境配置 保姆级详细教程,踩了很多坑,基本是手把手将教你完成模型部署

电点国际化翻译系统,助力你开启海外项目之旅_roll圈圈的博客-程序员秘密

1、前言项目要走向国外市场,移动端Android和iOS,当然也包括后端和前端,需要进行国际化适配,但是之前的项目中是没有英文翻译文件的,所以需要将项目中所有的中文字符串进行收集交给专业的人士进行翻译,然后将翻译的英文内容分别整理到Android和iOS项目中去。无疑这是一个很繁琐且很容易出错的事情,而且后续在开发的过程中还会新增中文字符串,这个时候我们又需要重新走一遍上面的流程,哪怕只是新增了一个字符串!于是我们需要一个系统去专门处理这件事件,将功能开发和英文翻译这两件事分离开来,让专业的人士去做专业

有关Python的22个编程技巧,请收下!_python 如何对一个变量进行连续操作_Python_1_3的博客-程序员秘密

1. 原地交换两个数字Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例:x,y= 10,20print(x,y)x,y= y,xprint(x,y)#1 (10, 20)#2 (20, 10)赋值的右侧形成了一个新的元组,左侧立即解析(unpack)那个(未被引用的)元组到变量 &lt;a&gt; 和 &lt;b&gt;...

zabbix5.0版本安装_Portzhu的博客-程序员秘密

zabbix5.0版本安装1:配置环境安装2:安装zabbix5.03:设置中文模式一:准备搭建系统环境centos7.6二:安装过程1:首先查看selinux是否关闭,没有关闭手动关闭# getenforce# vi /etc/selinux/conf //未关闭情况编辑关闭SELINUX=Disabled 修改为Disabled2:查看防火墙是否关闭# systemctl status firewalld# systemctl disable f

随便推点

mysql中的InnoDB 的UNIQUE唯一索引 是行级锁还是表级锁_编码的三叔的博客-程序员秘密

当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)...

k8s Configmap配置与Secret加密_k8s secret加密_浮生夢的博客-程序员秘密

ConfigMap功能在Kubernetes1.2版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMapAPI给我们提供了向容器中注入配置信息的机制,ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。将配置信息放到configmap对象中,然后在pod的对象中导入configmap对象,实现导入配置的操作。ConigMap是一种API对象,用来将非机密性的数据保存到键值对中。......

Eclipse:An internal error occurred during: "Build Project". GC overhead limit exceeded_微wx笑的博客-程序员秘密

在使用Eclipse的Build Project功能时,提示以下错误: An internal error occurred during: “Build Project”. GC overhead limit exceeded 如图: 搜索的一下,是属于java.lang.OutOfMemoryError。 OOM大家都知道,就是JVM内存溢出了,那GC overhead limit

解决PX4固件在Gazebo下进行SITL仿真时遇到的MODE: Unsupported FCU问题的方法_mode: unknown apm based fcu!_hxlanu的博客-程序员秘密

https://github.com/PX4/PX4-Autopilot/issues/12038cd PX4-Autopilotsource Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_defaultexport ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)/Tools/sitl_gazeb.

android des加密传输,android des加密和解密_Vani Town的博客-程序员秘密

加密方法:public String encryptDES(String encryptString, String encryptKey) throws Exception {IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);SecretKeySpec key = new SecretKeySpec(encryptKey.getB...

我的冒泡排序java代码+简单优化测试_FoolishBird-007的博客-程序员秘密

关于冒泡排序是什么怎么排序的我就不多赘述了,基本简单查找翻阅一下资料都可以弄明白,我这里是用冒泡排序的算法编写简单的java代码以及进行一些优化和之间的性能小评测。一、代码+讲解 (1)下面是一般的冒泡排序java代码: int arry[] = { 3, 2, 6, 8, 1, 9, 5 }; for (int i = 0; i &lt; arry.length; i++) { ...

推荐文章

热门文章

相关标签