.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./publish/
echo "拷贝配置中心的统一配置文件文件------------------------------开始-----------------------------------"
\cp ~/student/conf/userconf/appsettings.json $WORKSPACE/UserServicesApi/bin/Release/netcoreapp2./publish/
echo "拷贝配置中心的统一配置文件文件------------------------------完成-----------------------------------"
echo "构建Docker镜像-------------------------------开始----------------------------------"
docker build -t userimage .
echo "构建Docker镜像-------------------------------完成----------------------------------"
echo "运行Docker容器-------------------------------------开始----------------------------"
docker run --name=user_node1 -p : -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 .685MB Step / : FROM microsoft/dotnet:2.1-aspnetcore-runtime
---> 1fe6774e5e9e
Step / : WORKDIR /appidentity
---> Running in 08426ccfe3c0
Removing intermediate container 08426ccfe3c0
---> 74294d903cd5
Step / : COPY . .
---> 85793e032e03
Step / : EXPOSE
---> Running in 74e621bb8894
Removing intermediate container 74e621bb8894
---> 619a4dd62d83
Step / : 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 : -d identityimage
5c5963943892ef3a5ac199bf3c81e0e698d6c8ff1d434a96edbb7444a2f274d3
+ echo 运行Docker容器------------------------------------完成-----------------------------
运行Docker容器------------------------------------完成-----------------------------
Finished: SUCCESS
.NetCore下利用Jenkins如何将程序自动打包发布到Docker容器中运行的更多相关文章
- .NetCore下使用IdentityServer4 & JwtBearer认证授权在CentOS Docker容器中运行遇到的坑及填坑
今天我把WebAPI部署到CentOS Docker容器中运行,发现原有在Windows下允许的JWTBearer配置出现了问题 在Window下我一直使用这个配置,没有问题 services.Add ...
- 在 Docker 容器中运行应用程序
案例说明 运行 3 个容器,实现对网站的监控. 三个容器的说明: 容器 web: 创建自 nginx 映像,使用 80 端口,运行于后台,实现 web 服务. 容器 mailer: 该容器中运行一个 ...
- Windows10下的docker安装与入门 (三) 创建自己的docker镜像并且在容器中运行它
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- Jenkins简明入门(二) -- 利用Jenkins完成Python程序的build、test、deployment
大家可能还没搞清楚,Jenkins到底能做什么? 本节内容利用Jenkins完成python程序的build.test.deployment,让大家对Jenkins能做的事情有一个直观的了解. 本节内 ...
- docker 运行jenkins及vue项目与springboot项目(三.jenkins的使用及自动打包vue项目)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- 基于jenkins自动打包并部署docker环境
一.实验环境 git 192.168.200.71 jenkins 192.168.200.72 docker 192.16 ...
- Linux下将.Asp Core 部署到 Docker容器中
我们来部署一个简单的例子: 将一个简单的.Aps Core项目部署到Docker容器中并被外网访问 说明: 下面的步骤都是建立在宿主服务器系统已经安装配置过Docker容器,安装Docker相对比较简 ...
- 新一代Java程序员必学的Docker容器化技术基础篇
Docker概述 **本人博客网站 **IT小神 www.itxiaoshen.com Docker文档官网 Docker是一个用于开发.发布和运行应用程序的开放平台.Docker使您能够将应用程序与 ...
- 将netcore网站部署到docker容器中
一.背景 最近一直在看docker的教程,基础知识看的差不多了.理论总要运用于实践,所以下面我们就来把最简单的一个netcore网站托管到docker容器中. 环境:1.docker for wind ...
随机推荐
- Linux记录-AWK语法(转载)
1.原理 awk,一个行文本处理工具,逐行处理文件中的数据 语法:awk 'pattern + {action}' 说明:(1)单引号''是为了和shell命令区分开:(2)大括号{}表示一个命令分组 ...
- WebSocket实战之——JavaScript例子
一.详细代码案例 详细解读一个简单html5 WebSocket的Js实例教程,附带完整的javascript websocket实例源码,以及实例代码效果演示页面,并对本实例的核心代码进行了深入解读 ...
- jquery扩展代码少的分页bar
直接上图,上代码了,代码量少,不解释那么多了 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ...
- java实现网页验证码
Servlet: package cn.bdqn.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletExceptio ...
- Scapy Fuzz实现——S7协议从建连到“正常交流“(一)
转载:安全客 酝酿了“三秒钟“,准备理清逻辑写写我学习的心得,自认为和Siemens S7协议有过一段时间浅浅的“交流”,所以这过程中涉及到了自己整理的自认为有用的东西,涉及工具.脚本这般,发出来让大 ...
- transform,变换
1.transform属性:rotate(翻转),skew(倾斜),scale(缩放),translate(移位) 用法:transform: rotate(45deg) scale(0.5) ske ...
- dubbo框架原理
Dubbo提供了三个关键功能:基于接口的远程调用,容错与负载均衡,服务自动注册与发现. Dubbo使得调用远程服务就像调用本地java服务一样简单. https://www.jianshu.com/p ...
- [转]bus error与segment error
在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...
- vue UI框架
一.pc端 element UI 饿了么UI支持vue2.x80分优点:组件的API方法.属性等封装的较为完善缺点:样式有些生硬,不够炫酷美观 N3 N3支持vue2.x70分优点:组件操作几乎都有动 ...
- Maven入门-依赖管理(Jar包管理)(二)
1 依赖管理(Jar包管理) 1.添加依赖