zoukankan      html  css  js  c++  java
  • .NetCore下利用Jenkins如何将程序自动打包发布到Docker容器中运行

    说道这一块纠结了我两天时间,感觉真的很心累,Jenkins的安装就不多说了

    这里我们最好直接安装到宿主机上,应该pull到的jenkins版本是2.6的,里面很多都不支持,我自己试了在容器中安装的情况,效果很不满意

    这篇文章主要就是为了解决两个问题:

    1、配置问题

    2、容器发布运行问题

    为了解决这两个问题也是费了我不少精力,首先shell编程你的会啊,做一个DevOps真心累,关于Jenkin拉去代码的问题这里不多说,主要针对上面2个问题说下我个人的观点

    微服务架构都是有配置中心,为了解决第一个问题,这里我只能在服务器上放好不同的配置文件放到不同的目录,每次发布的时候根据需要去拷贝配置到发布目录中

    接下就是第二个问题了,第二个问题还是蛮头疼的,每次都要打包镜像,运行对应容器,这在自动化发布中就会出现 

    删除、停止 等相关shell命令 ,但是一旦这个东西不能存在 势必会报错导致发布不成功 ,我这里跟其他的处理方式不一样,有的是安装 danling=true 这种获取没有tag的方式,但是一般打包镜像后默认就加上了tag,所以 docker image -f danling=true这种方式不适用,并且运行中的容器你怎么去处理

    没办法自己脑补了下shell编程

    总结归纳后shell 代码如下

    echo "获取当前容器是否存在-----------------------------------------------------------------"
    containerps=$(docker ps -f name=user_node1 -q)
    containerstop=$(docker ps -a -f name=user_node1 -q)
    for alpha in "$containerps";do
        if [ "$alpha" == "" ];then
        echo "检查是否存在停止的容器-------------------------------------------------"
          for alpha1 in "$containerstop";do
               if [ "$alpha1" == "" ];then
                  echo "不存指定容器-----------------------------------"
             else
               echo "存在停止了的 然后直接删除-----------开始------------------"
              docker rm $alpha1
               echo "存在停止了的 然后直接删除-----------完成------------------"
             fi
          done
        else
        echo "存在-停止运行 然后删除----------------------开始-----------------"
        docker stop $alpha
        docker rm $alpha
         echo "存在-停止运行 然后删除---------------------完成------------------"
        fi
    done
    echo "获取当前镜像是否存在-----------------------------------------------------------------"
    dockerlist=$(docker images userimage:latest -q)
    for alpha2 in "$dockerlist";do
      if [ "$alpha2" == "" ];then
         echo "不存在指定镜像-------------------------------------------------" 
      else
           echo "存在当前指定的镜像 删除镜像--------------开始-----------------------------------"
          docker rmi $alpha2
         echo "存在当前指定的镜像 删除镜像--------------完成-----------------------------------"
      fi
    done
    
    echo "开始输入工作目录-----------------------------------------------------------------"
    echo $WORKSPACE
    echo "转到项目工程目录-----------------------------------------------------------------"
    cd $WORKSPACE/UserServicesApi/
    echo "还原.NetCore Nuget包-----------------------开始------------------------------------------"
    dotnet restore
    echo "还原.NetCore Nuget包-----------------------完成------------------------------------------"
    echo "重新生成------------------------------------开始-----------------------------"
    dotnet build
    echo "重新生成------------------------------------完成-----------------------------"
    echo "项目发布-------------------------------------开始----------------------------"
    dotnet publish -c Release
    echo "项目发布-------------------------------------完成----------------------------"
    echo "转到项目发布目录-----------------------------------------------------------------"
    cd bin/Release/netcoreapp2.1/publish/
    echo "拷贝配置中心的统一配置文件文件------------------------------开始-----------------------------------"
    cp  ~/student/conf/userconf/appsettings.json  $WORKSPACE/UserServicesApi/bin/Release/netcoreapp2.1/publish/
    echo "拷贝配置中心的统一配置文件文件------------------------------完成-----------------------------------"
    echo "构建Docker镜像-------------------------------开始----------------------------------"
    docker build -t userimage .
    echo "构建Docker镜像-------------------------------完成----------------------------------"
    echo "运行Docker容器-------------------------------------开始----------------------------"
    docker run --name=user_node1 -p 40001:80 -d userimage
    echo "运行Docker容器------------------------------------完成-----------------------------"

    首先需要判断是否存在运行中的指定名称容器,如果不存在再去检查是否存在停止的容器信息 ,存在运行的就先停止在删除 ,存在停止的就直接删除 ,注意我代码中定义的变量其实变量输入的值就是容器的 containerid 信息 这个很重要

    当然删除镜像就相对简单了 存在就删除就行了,这里有先后顺序,需要先删除容器信息,让后才能删除镜像信息

    下面就是Jenkins发布下打印出来的日志,只看下Docker这块的日志,容器ID,以及镜像ID都得到了,这样我们就不需要去关注容器以及镜像存在与否的问题,最后只需替换配置文件构建镜像文件运行容器就行了

    + echo 获取当前容器是否存在-----------------------------------------------------------------
    获取当前容器是否存在-----------------------------------------------------------------
    ++ docker ps -f name=user_node1 -q
    + containerps=e01378e87599
    ++ docker ps -a -f name=user_node1 -q
    + containerstop=e01378e87599
    + for alpha in '"$containerps"'
    + '[' e01378e87599 == '' ']'
    + echo '存在-停止运行 然后删除----------------------开始-----------------'
    存在-停止运行 然后删除----------------------开始-----------------
    + docker stop e01378e87599
    e01378e87599
    + docker rm e01378e87599
    e01378e87599
    + echo '存在-停止运行 然后删除---------------------完成------------------'
    存在-停止运行 然后删除---------------------完成------------------
    + echo 获取当前镜像是否存在-----------------------------------------------------------------
    获取当前镜像是否存在-----------------------------------------------------------------
    ++ docker images userimage:latest -q
    + dockerlist=5cb29f50bc92
    + for alpha2 in '"$dockerlist"'
    + '[' 5cb29f50bc92 == '' ']'
    + echo '存在当前指定的镜像 删除镜像--------------开始-----------------------------------'
    存在当前指定的镜像 删除镜像--------------开始-----------------------------------
    + docker rmi 5cb29f50bc92
    Untagged: userimage:latest
    Deleted: sha256:5cb29f50bc9218b776c9a04872c14ce92b84d3a2f368f7c1306c7a49b0e1e4e8
    Deleted: sha256:077943b3a82f33c3b7fba1b12372c936c86c8f41f3e43dbebb2d78b2145c5327
    Deleted: sha256:0c34caf4799497fdd12da7bb189f852e40aeaf397b06ac297a23f73272ac9fb8
    Deleted: sha256:50a14209600e45d7788494b8277c826e8df67e6765d82c41925ea69c439312f9
    + echo '存在当前指定的镜像 删除镜像--------------完成-----------------------------------'
    存在当前指定的镜像 删除镜像--------------完成-----------------------------------

     最后构建容器的日志信息都是没问题的

    + docker build -t identityimage .
    Sending build context to Docker daemon  8.685MB
    
    Step 1/5 : FROM microsoft/dotnet:2.1-aspnetcore-runtime
     ---> 1fe6774e5e9e
    Step 2/5 : WORKDIR /appidentity
     ---> Running in 08426ccfe3c0
    Removing intermediate container 08426ccfe3c0
     ---> 74294d903cd5
    Step 3/5 : COPY . .
     ---> 85793e032e03
    Step 4/5 : EXPOSE 80
     ---> Running in 74e621bb8894
    Removing intermediate container 74e621bb8894
     ---> 619a4dd62d83
    Step 5/5 : ENTRYPOINT ["dotnet", "IdentityServices.dll"]
     ---> Running in 2143346ae0f0
    Removing intermediate container 2143346ae0f0
     ---> 5155c3859e85
    Successfully built 5155c3859e85
    Successfully tagged identityimage:latest
    + echo 构建Docker镜像-------------------------------完成----------------------------------
    构建Docker镜像-------------------------------完成----------------------------------
    + echo 运行Docker容器-------------------------------------开始----------------------------
    运行Docker容器-------------------------------------开始----------------------------
    + docker run --name=identity_node1 -p 40000:80 -d identityimage
    5c5963943892ef3a5ac199bf3c81e0e698d6c8ff1d434a96edbb7444a2f274d3
    + echo 运行Docker容器------------------------------------完成-----------------------------
    运行Docker容器------------------------------------完成-----------------------------
    Finished: SUCCESS
  • 相关阅读:
    常见问题:bootstrap datepicker日期插件汉化
    好的插件
    问题11:web前端开发规范手册(转)
    问题10:获取当前页面宽度JS
    SQL学习1:基础
    问题9:tabtle 整理
    Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: PermGen space
    测试markdown 博客功能
    Cannot generate SSPI context
    Ubuntu 13 Zookeeper 集群配置
  • 原文地址:https://www.cnblogs.com/liyouming/p/9989160.html
Copyright © 2011-2022 走看看