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


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

    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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    将来会让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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    以上脚本的主要作用:
    根据我们编写的项目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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以看到,我们的容器用户是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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    最终的脚本内容

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    5、附录

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

  • 相关阅读:
    Springboot整合RabbitMQ详解
    宜搜科技死磕港交所上市:从搜索引擎到广告投放,业绩疲态凸显
    Frp内网穿透win系统实录
    关于设置图标
    Horovod 实战练习(含源码和详细配置)
    Linux之进程替换
    2000-2022年上市公司专利申请、创新绩效数据
    NLP冻手之路(2)——文本数据集的下载与各种操作(Datasets)
    Dockerfile COPY的奇怪行为:自动解包一级目录
    再见了,收费的云笔记,自己搭建的就是好用
  • 原文地址:https://blog.csdn.net/qq_39839075/article/details/132721587