.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
原文地址:https://www.cnblogs.com/liyouming/p/9989160.html