.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 ...
随机推荐
- Hdu 5072 Coprime(容斥+同色三角形)
原题链接 题意选出三个数,要求两两互质或是两两不互质.求有多少组这样的三个数. 分析 同色三角形n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数反面考虑这个问题,只 ...
- Javaweb中提到的反射浅析(附源码)
反射:一个jdk5.0的新特性,高级运用.在后期的框架中,这个是一大重点,现在估计我们都不会太多的接触他的.但是为了后面的铺垫,我想还是先了解一下: 先构造一个类,然后我们用反射来获取,调用里面的方法 ...
- SmartUpload文件上传组件的使用教程
在项目中使用SmartUpload组件可以进行文件的上传和下载操作 使用步骤 1.导入jar包,进行build path操作 2.编写文件上传页面,代码如下 <form action=" ...
- HAX kernel module is not installed
dev.android.emulator.haxm 运行emulator -avd xxx来启动名为xxx的模拟器,但报如下错误: emulator: ERROR: x86 emulation cur ...
- android 使用get和post将数据提交到服务器
1.activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android& ...
- luogu P4160 [SCOI2009]生日快乐
传送门 考虑因为每个人的蛋糕体积要相等,如果切了一刀,那么要使得分当前蛋糕的人根据分成的两部分蛋糕的体积分成两部分人,所以假设当前有n人,切的这一刀要是在x或y的\(\frac{k}{n}(k\in ...
- 啊金学习javascript系列一之javascript整体印象
javascript是一门编程语言,这个是第一个观点.是编程语言,那就拥有编程语言的功能.在我理解之中,编程语言是和计算机打交道的语言,就是我们跟计算机说话用的语言,是用来指挥计算机的.人类能够理解语 ...
- linux 链接理解
1.软链接 只包含另外软链接的基本信息, 生成与源文件不同的节点号, 可以链接目录.不同网络的文件 2.硬链接只能链接文件,不会生成节点号,说白了就是指针,指向同个文件,所以链接的节点号与源节点号一致
- 文加图, 理解Http请求与响应
1. http请求和响应步骤 在讲解OkHttp之前, 我们首先来个高清大图, 看下http请求的整个步骤, 有个整体概念. 2. http每一步详细内容 在一次完整的HTTP通信过程中, Web浏 ...
- matplotlib 画图
matplotlib 画图 1. 画曲线图 Tompson = np.array([0, 0, 0, 0, 0.011, 0.051, 0.15, 0.251, 0.35, 0.44, 0 ...