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

上一篇文章,我们完成了以下工作。
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.mzph.cn/news/77524.shtml

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

相关文章

crAPI靶场学习记录

靶场搭建 [靶场下载地址](我fork了一份) docker安装,笔者是用的wsldocker. [lab0:**初始账户 **] 1. 注册一个账户,邮箱为[APIqq.com],密码为Admin123 1. 登陆后访问对应IP的8025端口,接收邮件获取车辆信息。 [lab1:**访问其它用户…

Altium Designer如何查看制定了哪些快捷键?

随着时代高速发展,Altium Designer(AD)、Allegro、Pads等是全球主流的三大EDA软件,因此越来越多工程师被要求学习这些软件,在使用EDA软件设计PCB过程时,熟悉和合理配置快捷键是提高工作效率的关键之一&…

flink的物理DataFlow图及Slot处理槽任务分配

背景 在flink中,有几个比较重要的概念,逻辑DataFlow图,物理DataFlow图以及处理槽执行任务,本文就来讲解下这几个概念 概念详解 假设有以下代码:数据源和统计单词算子的并行度是2,数据汇算子的并行度是1&…

Vue3 Element-Plus 主题切换方案

1. .html 文件中&#xff0c;设置 <html> 标签的 “data-theme” 属性 2. 单独创建主题的样式文件 .css/.scss &#xff0c;并导入 3. 样式文件中创建不同主题对象 4. 定义不同主题中的样式变量 注意&#xff1a;左右两个主题的变量名一样&#xff0c;值不同 5. 页面样式…

C++之智能指针shared_ptr死锁问题(二百)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

畅玩HarmonyOS 4,趣味心情主题实况框攻略请收藏

看了HarmonyOS 4网友种草和媒体测评&#xff0c;早就跃跃欲试了&#xff0c;近期终于迎来HarmonyOS 4正式版&#xff0c;赶紧拿起我的华为P60升级体验了下&#xff0c;简直不要太丝滑、太好玩&#xff01;其中&#xff0c;最让我眼前一亮的是趣味心情主题与全新的实况窗&#x…

GLTF在线编辑器

GLTF在线编辑器提供了一个内置的模型查看器&#xff0c;可以加载和预览 glTF/glb 文件。用户可以在不用安装任何插件的情况下直接在浏览中快速查看和编辑器3D模型。 它的功能特点如下&#xff1a; 1、打开GLTF模型 用户可以在GLTF编辑器中拖入GLB/GLTF模型或者选择打开本地GL…

stm32---外部中断

一、EXTI STM32F10x外部中断/事件控制器&#xff08;EXTI&#xff09;包含多达20个用于产生事件/中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置&#xff0c;以选择类型&#xff08;中断或事件&#xff09;和相应的触发事件&#xff08;上升沿触发、下降沿触发…

C语言学习系列-->一篇带你看懂内存函数

文章目录 前言memcpy概述模拟实现 memmove概述模拟实现 memsetmemcmp总结 前言 上篇文章学习了C语言字符串函数&#xff0c;只是对字符串进行操作 本节&#xff0c;小编整理了一下C语言中的内存函数&#xff0c;对内存进行操作&#xff0c;只针对会内存块&#xff0c;不针对数据…

消息队列(二):创建核心类及数据库操作

我们核心类主要有四个&#xff1a; 交换机、队列、绑定、消息。这四个核心类还可以继续向下划分。除了这几个还有其他的核心类&#xff0c;先介绍这些&#xff0c;等后面讲到了相关功能实现后面再补充。 核心类 Exchange 关于交换机&#xff0c;我们主要需要实现三种交换机…

【python自动化应用】借助ChatGPT与Python轻松实现办公自动化 —— AIC松鼠活动第九期

背景&#xff1a;当今的工作环境中&#xff0c;高效和快速地完成日常任务对于个人和机构都至关重要。许多人正在利用Python自动化来提高他们的工作效率。Python自动化可以帮助您自动完成繁琐的、重复的、容易出错的任务&#xff0c;从而节省时间和精力。 Python自动化有很多应用…

前端vue按钮控制切换按钮是否禁用和颜色和显示隐藏,利用v-if和v-else

效果 未输入input前图片 输入input后图片 html (1) <input type"number" placeholder"请输入分润数量" placeholder-class"shareprofit_placeholder_num" v-model"money"> <!-- 金钱 --> {{money}} <!-- 可提现余额…

【【萌新编写risc-v之软件的学习使用】】

萌新编写risc-v软件的学习使用 对于vscode我其实没什么好说的 就是先配置好环境 其实vscde作为一个编译器的软件 其实并不需要指望能往里面加载多少功能 我们需要做的就是赋予编辑器更好用的功能和体验 有些人会在vscode里面甚至加入波形 仿真 我觉得不如交给 vivado来用 在vs…

PyTorch实战-实现神经网络图像分类基础Tensor最全操作详解(一)

目录 前言 一、PyTorch数据结构-Tensor 1.什么是Tensor 2.数据Tensor使用场景 3.张量形态 标量&#xff08;0D 张量&#xff09; 向量&#xff08;1D 张量&#xff09; 矩阵(2D张量) 3D 张量与高维张量 二、Tensor的创建 1. 从列表或NumPy数组创建 2. 使用特定的初始…

分拣平台API安全治理实战 | 京东物流技术团队

导读 本文主要基于京东物流的分拣业务平台在生产环境遇到的一些安全类问题&#xff0c;进行定位并采取合适的解决方案进行安全治理&#xff0c;引出对行业内不同业务领域、不同类型系统的安全治理方案的探究&#xff0c;最后笔者也基于自己在金融领域的经验进行了关于API网关治…

学习记忆——英语篇

文章目录 英语字母形象起源右脑记忆单词的原则四大步骤第一步&#xff1a;摄取信息第二步&#xff1a;处理信息第三步&#xff1a;储存信息第四步&#xff1a;提取信息 训练例子字母形象训练 右脑记忆单词5大方法字源法编码法字母编码法字母组合编码法 拼音法全拼法拼音组合 熟…

Navicat连接openGauss数据库报错

错误信息&#xff1a;fe_sendauth:invalid authentication request from server:AUTH_REQ_SASL_CONT without AUTH_REQ_SASL 解决步骤&#xff1a; 1&#xff09;关闭防火墙&#xff1a; 切换root用户执行&#xff1a;su - root 输入密码 systemctl status firewalld 查…

神经网络 01(介绍)

一、神经网络 人工神经网络 (Artificial Neural Network&#xff0c;简写为ANN)也简称为神经网络 (NN)&#xff0c;是一种模仿生物神经网络结构和功能的 计算模型。人脑可以看做是一个生物神经网络&#xff0c;由众多的神经元连接而成。各个神经元传递复杂的电信号&#xff0c…

Vue3事件处理

文章目录 Vue3事件处理1. 概念2. 实例2.1 点击按钮次数12.2 v-on 可以接收一个定义的方法来调用2.3 内联 JavaScript 语句2.4 事件处理程序中调用多个方法 3. 事件修饰符4. 按键修饰符 Vue3事件处理 1. 概念 使用 v-on 指令来监听 DOM 事件&#xff0c;从而执行 JavaScript 代…

计算机网络初识

目录 1、计算机网络背景 网络发展 认识 "协议" 2、网络协议初识 OSI七层模型 TCP/IP五层(或四层)模型 3、网络传输基本流程 网络传输流程图 数据包封装和分用 4、网络中的地址管理 认识IP地址 认识MAC地址 1、计算机网络背景 网络发展 在之前呢&…