之前曾写过docker及jenkins基础使用  https://www.cnblogs.com/xiaochangwei/category/816943.html

现在搭建环境的功能为:

1.jenkins自动拉取代码打包

2.根据时间戳生成docker镜像

3. 启动生成的镜像

  3.1.可以指定启动的名字和访问路径

  3.2.可以指定端口

  3.3.如果端口或名字已经被占用,则直接停掉之前启动的

4.访问的时候不要输入端口,直接为 测试环境ip/应用名字

根据要求,采用了下列步骤方法:

1.构建后动态生成Dockerfile

2.构建docker镜像

3.停掉端口或名称冲突的docker服务

4.启动新生成的镜像

5.更新nginx配置文件并重启nginx

为了简单方便且动态指定各项参数,直接采用了构建后shell操作

-------------------------------------------------------------------------------------

#参数设定
#1.映射端口,不指定则使用随机值
PORT= #2.容器名字,不指定则使用打包tag号,如:jenkins-myapp-18
NAME= #-----------------------下列内容请勿修改---------------------------------
#-----------------------下列内容请勿修改---------------------------------
#-----------------------下列内容请勿修改---------------------------------
if [ -z "$NAME" ]; then
NAME=$JOB_NAME
fi TAG=`date "+%Y%m%d%H%M%S"` rm -f Dockerfile
cat > Dockerfile << EOF
FROM tomcat:8-jre8
MAINTAINER xiaochangwei <changw.xiao@qq.com>
LABEL app="testApp" version="0.0.1" by="xiaochangwei"
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY ./target/*.war /usr/local/tomcat/webapps/$NAME.war
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
EOF IMAGE=$JOB_NAME/$NAME:$TAG
docker build -t $IMAGE --rm=true . #检查容器名称是否存在,存在则停止并删除
exsitContainer=`docker ps -a --filter name=$NAME |awk '{print $1}'|tail -n +2`
echo $exsitContainer
if [ -n "$exsitContainer" ]; then
docker stop $exsitContainer
docker rm $exsitContainer
fi #如果指定了端口,则检查端口是否被占用,如被占用,直接停止对应容器
if [ -n "$PORT" ]; then
containers=`docker ps -a --filter status=running|grep ':'$PORT |awk '{print $1}'`
echo 'containers:'$containers
if [ ${#containers[@]} -gt 0 ];then
echo 'stop container:'$containers
#docker stop $containers
for container in $containers
do
docker stop $container
done
fi
#根据指定端口启动容器
docker run -d --privileged=true --env JAVA_OPTS=-Duser.timezone=GMT+08 -p $PORT:8080 --name $NAME $IMAGE
else
#使用随机端口启动容器
docker run -d -P --env JAVA_OPTS=-Duser.timezone=GMT+08 --name $NAME $IMAGE
fi #调用脚本更新nginx代理配置
sh /docker/nginx/nginx_conf_update.sh docker ps -a |grep $IMAGE

其中  /docker/nginx/nginx_conf_update.sh 逻辑为:通过docker ps 列出启动的镜像应用,然后动态生成nginx配置文件

[root@localhost nginx]# cat nginx_conf_update.sh
#!/bin/bash path=/docker/nginx/conf.d/default.conf echo "" > $path echo "server {" >> $path echo "listen 80;" >> $path
echo "client_max_body_size 200m;" >> $path
echo "server_name localhost;" >> $path echo "fastcgi_buffers 18 128k;" >> $path
echo "send_timeout 300;" >> $path
#echo "fastcgi_connect_timeout 300s;" >> $path
#echo "fastcgi_send_timeout 300s;" >> $path
#echo "fastcgi_read_timeout 300s;" >> $path #echo "proxy_connect_timeout 500s;" >> $path
#echo "proxy_read_timeout 500s;" >> $path
#echo "proxy_send_timeout 500s;" >> $path echo "" >> $path docker_ip(){
port=$(docker port $1 | grep 80 | cut -d':' -f2)
if [ ${#port} -gt 0 ]; then
#ip=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' $1)
#ok=$(cat ../data/nginx/conf.d/default.conf |grep $1) #if [ ${#ok} -gt 0 ];then
# echo "存在"
# sed -i '/\'$1'/,+3d' ../data/nginx/conf.d/default.conf
#fi firewall-cmd --zone=public --add-port=$port/tcp --permanent sed -i '$i \
\
location '$1' { \
proxy_pass http://172.17.0.1:'$port$1'; \
proxy_set_header Host $host; \
proxy_connect_timeout 500s; \
proxy_read_timeout 500s; \
proxy_send_timeout 500s; \
} ' $path
fi
}
for i in $(docker inspect -f '{{.Name}}' $(docker ps -aq))
do
docker_ip $i
done echo " location / {" >> $path
echo " proxy_pass http://172.17.0.1:13380/;" >> $path
echo " proxy_set_header Host \$host; " >> $path
echo " client_max_body_size 200m;" >> $path
echo " } " >> $path echo " location /jenkins {" >> $path
echo " proxy_pass http://172.17.0.1:8081/;" >> $path
echo " proxy_set_header Host \$host; " >> $path
echo " client_max_body_size 200m;" >> $path
echo " } " >> $path echo "}" >> $path firewall-cmd --reload
docker exec -i nginx nginx -s reload
[root@localhost nginx]#

在构建前需要先启动一个nginx

docker run -d -p 80:80 --name=nginx  --restart=always -v /etc/localtime:/etc/localtime -v /docker/nginx/conf.d:/etc/nginx/conf.d nginx

这样构建后就能直接通过 ip/应用名称 访问应用了  无需关心具体映射的端口

[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] [1;32mBUILD SUCCESS[m
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] Total time: 20.770 s
[[1;34mINFO[m] Finished at: 2019-05-05T14:23:44+08:00
[[1;34mINFO[m] Final Memory: 39M/440M
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[bdjc_ls_x] $ /bin/sh -xe /tmp/jenkins4101726310382471801.sh
+ PORT=
+ NAME=
+ '[' -z '' ']'
+ NAME=bdjc_ls_x
++ date +%Y%m%d%H%M%S
+ TAG=20190505142345
+ rm -f Dockerfile
+ cat
+ IMAGE=bdjc_ls_x/bdjc_ls_x:20190505142345
+ docker build -t bdjc_ls_x/bdjc_ls_x:20190505142345 --rm=true .
Sending build context to Docker daemon 176.9 MB Step 1/6 : FROM tomcat:8-jre8
---> dd6ff929584a
Step 2/6 : MAINTAINER xiaochangwei <changw.xiao@qq.com>
---> Using cache
---> 3bbe1bdd60b1
Step 3/6 : LABEL app "testApp" version "0.0.1" by "xiaochangwei"
---> Using cache
---> fa190e40687a
Step 4/6 : RUN rm -rf /usr/local/tomcat/webapps/ROOT
---> Using cache
---> 75294c2b57d3
Step 5/6 : COPY ./target/*.war /usr/local/tomcat/webapps/bdjc_ls_x.war
---> ea3a50c66ed9
Removing intermediate container 5936210f7b50
Step 6/6 : ENTRYPOINT /usr/local/tomcat/bin/catalina.sh run
---> Running in 61ace663e5a4
---> 48f8683a1145
Removing intermediate container 61ace663e5a4
Successfully built 48f8683a1145
++ docker ps -a --filter name=bdjc_ls_x
++ awk '{print $1}'
++ tail -n +2
+ exsitContainer=
+ echo + '[' -n '' ']'
+ '[' -n '' ']'
+ docker run -d -P --env JAVA_OPTS=-Duser.timezone=GMT+08 --name bdjc_ls_x bdjc_ls_x/bdjc_ls_x:20190505142345
7e85e36db00dde78495608e81d8bfe35e93e08f13b1b4216c3961a460e121017
+ sh /docker/nginx/nginx_conf_update.sh
success
[91mWarning: ALREADY_ENABLED: 32822:tcp[00m
success
[91mWarning: ALREADY_ENABLED: 32821:tcp[00m
success
[91mWarning: ALREADY_ENABLED: 32814:tcp[00m
success
[91mWarning: ALREADY_ENABLED: 80:tcp[00m
success
[91mWarning: ALREADY_ENABLED: 88:tcp[00m
success
[91mWarning: ALREADY_ENABLED: 9999:tcp[00m
success
[91mWarning: ALREADY_ENABLED: 8080:tcp[00m
success
[91mWarning: ALREADY_ENABLED: 9099:tcp[00m
success
success
2019/05/05 14:24:04 [notice] 263#263: signal process started
+ grep bdjc_ls_x/bdjc_ls_x:20190505142345
+ docker ps -a
7e85e36db00d bdjc_ls_x/bdjc_ls_x:20190505142345 "/usr/local/tomcat..." 12 seconds ago Up 11 seconds 0.0.0.0:32823->8080/tcp bdjc_ls_x
Finished: SUCCESS

构建日志

jenkins自动打包生成docker镜像后自动发布并nginx代理访问的更多相关文章

  1. Jenkins集成Docker镜像实现自动发布

    1. 思路&流程 Jenkins集成Docker镜像实现自动发布与Jenkins发布mavne项目思路一样总体流程 为:Jenkins 拉去远端源码 -- gitl实现应用打包 -- jenk ...

  2. 将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定

    1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...

  3. 操作系统-容器-Docker:如何将应用打包成为 Docker 镜像?

    ylbtech-操作系统-容器-Docker:如何将应用打包成为 Docker 镜像? 1.返回顶部 1. 虽然 DockerHub 提供了大量的镜像,但是由于企业环境的多样性,并不是每个应用都能在 ...

  4. 将 ASP.Net Core WebApi 应用打包至 Docker 镜像

    将 ASP.Net Core WebApi 应用打包至 Docker 镜像 运行环境为 Windows 10 专业版 21H1, Docker Desktop 3.6.0(67351),Docker ...

  5. SpringBoot打包成Docker镜像

    1. 本文环境 Maven:3.6.3(Maven配置参考) SpringBoot version:2.3.4.RELEASE Docker version: 19.03.11(Docker搭建参考) ...

  6. golang应用打包成docker镜像

    golang编译的应用是不需要依赖其他运行环境的,那么为什么还需要打包成docker镜像呢?当需要附带配置和日志等文件时可以更方便的移植和运行,下面介绍从dockerfile编译成镜像. 在项目根目录 ...

  7. JPA中自动使用@Table(name = "userTab")后自动将表名、列名添加了下划线的问题

    一.问题 JPA中自动使用@Table(name = "userTab")后自动将表名.列名添加了下划线的问题,如下图: 二.解决 在application.properties文 ...

  8. VS2010 打包生成exe文件后 执行安装文件出现 TODO:&lt;文件说明&gt;已停止工作并已关闭

    一.VS2010 打包生成exe文件后  执行安装文件出现  TODO:<文件说明>已停止工作并已关闭 TODO: <文件说明>已停止工作 原因: 打包的时候在文件系统中建立了 ...

  9. Spring Boot 集成servlet,发布为可直接运行的war包,方便后续打包为docker镜像。

    背景:Spring Boot 集成servlet,发布为可直接运行的war包,方便后续打包为docker镜像. 原文地址 https://github.com/weibaohui/springboot ...

随机推荐

  1. 1.Python爬虫入门_urllib

    #2019-11-22 import urllib.request #Pthon自带的网络连接库 import gzip #解压缩库 #程序入口 if __name__=='__main__': #u ...

  2. c# 第23节 外部方法

    本节内容: 1:外部方法是什么 2:外部方法的实现 1:外部方法是什么 2:外部方法的实现 样式: 实现方式:很少 用自己多加练习把

  3. jwt揭秘(含源码示例和视频)

    JSON Web Tokens,是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流程 在项 ...

  4. day49_9_10jQuery剩余

    一.表单筛选器. 在jQuery中有,专门对表单中的元素,进行筛选的表单筛选器. 其实使用基本筛选器也可以筛选出相应的元素,但是,为了jQuery的简便性,以及对表单操作的频繁,这里可以使用专门的筛选 ...

  5. 20191028 牛客网CSP-S Round2019-1

    花了 \(30min\) 打了 \(180\) 分的暴力... 仓鼠的石子游戏 问题描述 链接:https://ac.nowcoder.com/acm/contest/1100/A 仓鼠和兔子被禁止玩 ...

  6. layui教程---table

    layui.config({ base: "${ctx}/static/js/" }).use(['form', 'layer', 'jquery', 'common','elem ...

  7. Python thread & process

    线程 点击查看 <- 进程 点击查看 <- 线程与进程的区别 线程共享内部空间:进程内存空间独立 同一个进程的线程之间可以直接交流:两个进程之间想通信必须通过一个中间代理 创建新线程很简单 ...

  8. 2019 SDN阅读作业

    2019 SDN阅读作业 1.为什么需要SDN?SDN特点? 答:因为随着网络规模的不断扩大,封闭的网络设备内置了过多的复杂协议,增加了运营商定制优化网络的难度,科研人员无法在真实环境中规模部署新协议 ...

  9. Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元

    https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ...

  10. 【洛谷4920】[WC2015] 未来程序(提答题)

    点此看题面 大致题意: 把\(10\)个点的暴力代码和输入数据都给你,让你求出输出数据. 子任务\(1\) 第一个子任务自然是拿来送分用的... 容易发现就是一个快速乘的过程啊. 代码如下: #inc ...