docker从零部署jenkins保姆级教程(下)

news2025/1/11 2:27:44

上一篇文章,我们完成了以下工作。
1)、docker部署jenkins
2)、建立第一个jenkins job
3)、通过jenkins job自动编译构建我们的github项目
上面所做的3个工作,其实都是为了这一篇文章打基础,不管是部署docker还是部署jenkins,我们最终的目的还是部署我们的项目,让项目跑起来,让流量进来,这才是一个项目的真正意义所在。
这一篇文章,我们就要让我们的项目部署到docker中,跑起来。

文章目录

  • 1、编写Dockerfile
  • 2、jenkins增加shell脚本
  • 3、编写一个简单的controller验证功能
  • 4、报错解决
    • 4.1、docker not found
      • 4.1.1、错误简述
      • 4.1.2 错误解决
    • 4.2、no such file or directory
      • 4.2.1、错误简述
      • 4.2.1、错误解决
    • 4.3、The container name xxx is already in use by container
      • 4.3.1、错误简述
      • 4.3.2、错误解决
  • 5、附录

1、编写Dockerfile

在我们项目的根目录,增加一个Dockerfile文件,文件名称就是:Dockerfile,注意:不要带任何文件名后缀。

//1、基础镜像使用java:openjdk-8u111
FROM java:openjdk-8u111
//2、本地docker工作目录/var/lib/docker映射容器的/tmp目录
VOLUME /tmp
//3、将本地target路径下的testJenkinsDocker.jar包改为app.jar
ADD target/testJenkinsDocker.jar app.jar
//4、容器的访问端口是12000
EXPOSE 12000
//5、执行java -jar命令在容器中启动项目
ENTRYPOINT ["java","-jar","/app.jar"]

将来会让jenkins根据这个Dockerfile构建我们的项目镜像

2、jenkins增加shell脚本

增加这个shell脚本的目的是:让jenkins根据我们编写的项目Dockerfile构建项目镜像,然后根据项目镜像创建项目容器,运行项目。
在流水线的操作页面点击configure。
在这里插入图片描述
然后拉到最下面,增加一个build step
在这里插入图片描述
填入如下的内容,(注意把注释删除)

#1、进入流水线的工作目录,这个docker_test_job是我们上一篇建立的job,这个job的作用是:自动编译构建我们的github项目,构建的结果就会发布到这个目录
cd /var/jenkins_home/workspace/docker_test_job
#2、根据Dockerfile构建一个镜像。最后的那个"."的意思是使用当前目录的Dockerfile构建
docker build -t test_jenkins_docker .
#3、这条docker run命令上一篇介绍过了,这里不再赘述
docker run -d -p 12000:12000 --name testJenkinsDocker test_jenkins_docker:latest

以上脚本的主要作用:
根据我们编写的项目Dockerfile构建一个项目镜像,根据这个项目镜像创建一个项目容器并运行。

3、编写一个简单的controller验证功能

这个就不写了,自己随便写一个,浏览器访问验证一下

4、报错解决

4.1、docker not found

4.1.1、错误简述

在这里插入图片描述

这个报错是jenkins在构建项目,执行脚本的时候报的,报错很明显,jenkins容器中并没有docker,所以执行失败。没有docker,我们装一个docker不就行了吗?没这么简单,我们可以登录一下jenkins的容器。可以看到容器的登录用户是jenkins,不是root用户,jenkins用户的权限不支持你安装docker。

4.1.2 错误解决

我在这个问题上卡了好一阵子,尝试了很多方法都不行,最终参考了国外老哥写的一篇文章,解决了这个问题。原文地址
这个老哥的解决方案很简单,进入容器不是root用户,我们它是root用户不就可以了吗?所以,不直接使用docker hub上下载下来的jenkins镜像了,而是自己编写Dockerfile构建一个jenkins镜像,Dockerfile内容如下:

#1、基础镜像还是使用我们第一篇文章中的jenkins/jenkins:jdk11
FROM jenkins/jenkins:jdk11
#2、容器使用root用户
USER root
#3、基础镜像基于debian linux套件,所以下载软件使用apt-get命令
RUN apt-get update
#4、在容器中安装docker
RUN curl -sSL https://get.docker.com/ | sh

可以看到,我们的容器用户是root,然后在容器中安装了docker

4.2、no such file or directory

4.2.1、错误简述

在这里插入图片描述
这个错误很明显,就是jenkins在执行脚本构建项目镜像的时候找不到testJenkinsDocker-1.0-SNAPSHOT.jar文件

4.2.1、错误解决

我们可以到jenkins对应的流水线目录看一下,到底有没有testJenkinsDocker-1.0-SNAPSHOT.jar呢。我们这个流水线名称是:docker_test_job,所以对应的流水线目录是:
/var/jenkins_home/workspace/docker_test_job,进到这个目录中,看看jenkins打出来的jar包名字是不是:testJenkinsDocker-1.0-SNAPSHOT.jar,如果不是,要修改项目中的Dockerfile文件,让jar包名字保持一致

4.3、The container name xxx is already in use by container

4.3.1、错误简述

在这里插入图片描述

已经存在相同名称的镜像了,所以docker build再次构建项目名称的镜像会报错。

4.3.2、错误解决

镜像已存在,我们直接把已存在的镜像删除,所以在jenkins执行脚本中的第一行命令下增加如下命令:

#停止容器
docker stop testJenkinsDocker
#删除容器
docker rm testJenkinsDocker
#删除镜像
docker rmi test_jenkins_docker:latest

最终的脚本内容

cd /var/jenkins_home/workspace/docker_test_job
docker stop testJenkinsDocker
docker rm testJenkinsDocker
docker rmi test_jenkins_docker:latest
docker build -t test_jenkins_docker .
docker run -d -p 12000:12000 --name testJenkinsDocker test_jenkins_docker:latest

再次构建,就可以了。这里我觉着肯定不应该这么麻烦,但是我没有找到更好的方法,如果有哪位大佬有更优的脚本,希望指导一下。

5、附录

附录里想继续说下/var/jenkins_home/workspace/docker_test_job这个目录,这个目录是jenkins的流水线目录,其中存储着我们的docker_test_job流水线的信息,这个目录下有啥呢?我们以我们创建的docker_test_job举例:
在这里插入图片描述
其实就是我们的项目根目录,看到这里其实就能理解jenkins中,我们的脚本为啥第一行是:
cd /var/jenkins_home/workspace/docker_test_job
这相当于进入了我们项目的根目录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/981777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

d435i 相机和imu标定

一、IMU 标定 使用 imu_utils 功能包标定 IMU,由于imu_utils功能包的编译依赖于code_utils,需要先编译code_utils,主要参考 相机与IMU联合标定_熊猫飞天的博客-CSDN博客 Ubuntu20.04编译并运行imu_utils,并且标定IMU_学无止境的…

补码:将减法运算转化为另一种形式的加法运算

文章目录 解析 个人见解,如有错误,请多包涵。 解析 对于人来说,减法是简单容易的。 被减数和减数列式相减,从低位到高位分别计算,有需要的借位就可以了。 这是一种可以在计算机上成立的理论方案,但是由于…

SpringMVC常用注解介绍及参数传递说明

前言 上一篇文章介绍了SpringMVC是什么以及它的工作流程和核心组件,介绍入门示例时,提到了RequestMapping注解,那么这篇文章就来介绍SpringMVC中更多的常用的注解,以及它的参数传递。 一. SpringMVC常用注解 1.1 RequestParam …

Homebrew安装cocoapods: zsh: command not found: brew解决方法

问题描述: 通过Homebrew安装cocoapods时,输入命令行 brew install cocoapods出现如下报错: zsh: command not found: brew zsh:找不到命令:brew 问题解决: 使用以下命令,重新安装Homebrew. /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/ra…

永恒之黑_CVE-2020-0796漏洞复现

永恒之黑:CVE-2020-0796漏洞复现 目录 永恒之黑:CVE-2020-0796漏洞复现漏洞介绍漏洞影响范围漏洞复现1.环境准备2.复现过程 漏洞介绍 本漏洞源于SMBv3没有正确处理压缩的数据包,在解压数据包的时候使用客户端传过来的长度进行解压时&#xf…

机器学习——boosting之提升树(未完)

提升树和adaboost基本流程是相似的 我看到提升树的时候,懵了 这…跟adaboost有啥区别??? 直到看到有个up主说了,我才稍微懂 相当于,我在adaboost里的弱分类器,换成CART决策树就好了呗&#xff1…

springboot + activiti实现activiti微服务化

概述 本文介绍如何将springbootactiviti进行整合,并配合eureka,zuul和feign实现activiti的微服务化,将流程控制和业务逻辑分离. 并实现了几个比较特殊的功能,比如时间段委托(某人请假或出差,出差时间内,所有待办交给被委托人处理),比如节点的无限级加签功能(流程本身有不确定性…

php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法非常简单

php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime。下面首先还是以示例说明如何使用 mktime 获取今日、昨日、上周、本月的起始时间戳和结束时间戳,然后在介绍一下 mktime 函数作用和用法。非常简单哦…

vue3组件通信学习笔记

1、Prop 父组件 <template><div class"parent"><h1>我是父元素</h1><Child :msg"msg"></Child></div> </template><script setup> import Child from ./Child.vue let msg ref(我是父组件的数据…

单片机采集传感器数据(整形,浮点型)modbus上传

浮点型数据 占两个寄存器&#xff08;四个字节&#xff09; short 整形 占一个寄存器 &#xff08;两个字节&#xff09; 注意&#xff01;&#xff01;&#xff01;&#xff01; stm32 是小端模式&#xff0c;而modbus解析数据是大端模式 所以先发送高字节 如int a16777220…

【QML】使用 QtQuick2的ListView创建一个列表(一)

qtquick2版本和qtquick1版本分别提供了一个ListView组件供使用&#xff0c;两个组件在使用上和属性的提供上还是有比较大的差异的&#xff0c;因为qtquick2是新的&#xff0c;所以就以改版本为基础学习如何使用&#xff1b; 首先&#xff0c;要知道ListView提供了那些属性提供修…

2023年智能家居占消费电子出货量28%,蓝牙Mesh照明占据重要位置

市场研究机构 TechInsights 的最新报告显示&#xff0c;预计 2023 年全球消费者在智能家居相关硬件、服务和安装费方面的支出将复苏&#xff0c;达到 1310 亿美元&#xff0c;比 2022 年增长 10%。TechInsights 表示&#xff0c;消费者在智能家居系统和服务上的支出将继续强劲增…

【UIPickerView案例05-省市选择界面数据展示 Objective-C语言】

一、省市选择界面数据展示 1.省市选择界面数据展示,就是这样的一个东西 我们接下来,看我们第二个案例,就是这个省市选择, 左边选择一个省,右边就把这个省所有的市展示出来 比如,我现在展示的是山东的城市, 我选择一个山西 第一步干嘛,是不是也是分析它的界面 1)上…

Android Automotive编译

系统准备 安装系统 准备一台安装Ubuntu系统的机器&#xff08;windows系统的机器可以通过WSL安装ubuntu系统&#xff09; 安装docker 本文使用docker进行编译&#xff0c;因此提前安装docker。参考网络链接安装docker并设置为不使用sudo进行docker操作。 参考链接&#xff…

B-Tree 索引和 Hash 索引的对比

分析&回答 B-Tree 索引的特点 B-tree 索引可以用于使用 , >, >, <, < 或者 BETWEEN 运算符的列比较。如果 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可以使用这种索引。 有时&#xff0c;即使有索引可以使用&#xff0c;MySQL 也不使用任何索引。…

2023 最新 Git 分布式版本控制系统介绍和下载安装使用教程

Git 基本概述 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。 集中式和分布式的区别&#xff1f; 最常见的集中式版本控制系统是SVN&#xff0c;版本库是集中放在中央处理器中的&#xff0c;而干活的时候&#xff0c;用的都是自己电…

类和对象(Java)

目录 一、面向对象的初步认知1、什么是面向对象2、面向对象与面向过程 二、类和类的实例化1、什么是类2、类的实例化3、类和对象的说明 三、this引用1、为什么要有this引用2、什么是this引用3、this引用的特性 四、对象的构造及初始化1、如何初始化对象2、构造方法 五、封装1、…

React三属性之:props

作用 将父组件的参数传递给子组件 父组件 import ./App.css; import React from react; import PropsTest from ./pages/propsTest class App extends React.Component{render(){return(<div><h2>App组件</h2><PropsTest obj{{name:王惊涛,age:27}}>…

首发丨全球首款用于激光雷达的商用光控超表面芯片发布!激光雷达降本再添可选项

《激光雷达老炮儿》最新获悉,美国光学半导体创业公司Lumotive于上周五宣布正式对外推出其首款极具开创性、基于光控超表面 (LCM)技术的完整产品LM10,该产品也是世界上首款商用数字光束控制解决方案。 与机械系统相比,Lumotive的数字光束控制技术凭借其卓越的成本、尺寸和可…

基于Python机器学习、深度学习提升气象、海洋、水文应用教程

详情点击链接&#xff1a;基于Python机器学习、深度学习提升气象、海洋、水文应用教程 前沿 Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准…