说道这一块纠结了我两天时间,感觉真的很心累,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