.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 ...
随机推荐
- Ubuntu14.10安装TensorFlow1.0.1
本文记录了在Ubuntu上安装TensorFlow的步骤.系统环境:Ubuntu14.10 64bitPython版本:Python 2.7.8TensorFlow版:TensorFlow 1.0.1 ...
- Java EE之Hibernate异常总结【3】Disabling contextual LOB creation as createClob() method threw error java.lang.reflect.InvocationTargetException
参考文献:https://stackoverflow.com/questions/4588755/disabling-contextual-lob-creation-as-createclob-met ...
- XML之Well-Formed文档规则
由于课程原因,近日粗略学习XML,载以博客是为担心忘记,以供日后复习之用. XML标准中明确规定了XML文件应当遵守的规则,大致上分成基本规则和DTD(Document Type Definition ...
- tensorflow神经网络拟合非线性函数与操作指南
本实验通过建立一个含有两个隐含层的BP神经网络,拟合具有二次函数非线性关系的方程,并通过可视化展现学习到的拟合曲线,同时随机给定输入值,输出预测值,最后给出一些关键的提示. 源代码如下: # -*- ...
- luogu P1486 [NOI2004]郁闷的出纳员
一万年以后终于调过了这题 这道题主要是维护一个有序的集合(吧),所以使用平衡树(我这里用\(Splay\)) 记录一个变量\(ff\)(雾),表示所有工资的变化量 对于\(I\)操作,如果初始工资大于 ...
- mysql 案例~关于pt-osc工具的用途
简介:今天咱们聊聊PT-OSC的东东一 简单介绍 1 标准组合 pt-online-schema-change --user= --password= --host= D=,t= --sock= ...
- 以前的 Delphi版本
Delphi 1 Delphi 2 Delphi 3 Delphi 4 Delphi 5 Delphi 6 Delphi 7 Delphi 8 Delphi 2005
- jquery 学习(五) - CSS 操作
HTML + CSS 样式 /*CSS样式*/<style> body{ margin: 0; } div{ width: 100%; height: 2000px; background ...
- iOS视频流开发(2)—视频播放
承上篇,本篇文章主要介绍iOS视频播放需要用到的类.以及他们的使用场景和开发中遇到的问题. MPMoviePlayerViewController MP简介 iOS提供MPMoviePlayerCon ...
- Codeplex最流行25个开源项目
1. VMukti富媒体协作平台 2. Microsoft SQL Server Product Samples: Engine 3. Patterns & Practices: Enterp ...