jenkins集成docker实现自动镜像构建部署

其实不集成docker也能实现自动部署,那为啥还要集成docker呢?

docker的优势在于可快速部署到其它环境中,包括其它额外的环境。

下面以一个真实案例进行部署

其它步骤同“构建、部署到服务器并执行脚本”,不同之处在于远程执行shell脚本

编写shell脚本,实现自动构建镜像文件Dockerfile并构建、运行

devops.sh脚本如下:

#!/bin/bash
# this script function is :                
# deploy new docker container             
#                                          
# USER        YYYY-MM-DD - ACTION          
# youpanpan   2019-01-28 - CREATED        
parasnum=5
# function
help_msg()
{
cat << help
+ Error Cause:
+ you enter $# parameters
+ the total paramenter number must be $parasnum
+ 1st :DOCKER_NAME
+ 2nd :PROJECT_NAME
+ 3rd :PROJECT_VERSION
+ 4th :SOURCE_PORT
+ 5th :DESTINATION_PORT
help
}
# Check parameter number
if [ $# -ne ${parasnum} ]
then
        help_msg 
        exit
fi
# Initialize the parameter.
DOCKER_NAME=$1
PROJECT_NAME=$2
PROJ_VERSION=$3
SPORT=$4
DPORT=$5
PROJ_VERSION=${PROJ_VERSION/"origin/"/""}
DOCKER_FILE="/usr/local/dockerfiles/${DOCKER_NAME}/Dockerfile"
DOCKER_FILE_DIR=/usr/local/dockerfiles/${DOCKER_NAME}
if [ ! -d ${DOCKER_FILE_DIR} ]; then
        mkdir -p ${DOCKER_FILE_DIR}
fi

source usr/local/dockerfiles/scripts/mvjar.sh 

# check docker images
DOCKER_IMAGE=`/usr/bin/docker images | grep ${DOCKER_NAME} | awk -F ' ' '{print $3}'`
if [ -n "${DOCKER_IMAGE}" ]; then
        # check docker container
        for dc in `/usr/bin/docker ps -a | grep ${DOCKER_NAME} | awk -F " " '{print $1}'`
        do
                echo "Stop container: ${dc}"
                /usr/bin/docker stop ${dc}
                # delete while docker container was exists
                echo "##Delete exists Container_Id: "${dc}
                /usr/bin/docker rm ${dc}
        done

        # delete while docker image was exists
        echo "#Delete exists Image: "${DOCKER_IMAGE}
        /usr/bin/docker rmi ${DOCKER_IMAGE} 
fi
# Init dockerfile
echo "**Init dockerfile start: "${DOCKER_FILE}
echo "FROM jdk" > ${DOCKER_FILE}
echo 'MAINTAINER youpanpan "youpp@gswlgf.com"' >> ${DOCKER_FILE}
echo "ADD ${PROJECT_NAME}.jar ${PROJECT_NAME}.jar" >> ${DOCKER_FILE}
echo "EXPOSE 8988" >> ${DOCKER_FILE}
echo "ENTRYPOINT java -jar ${PROJECT_NAME}.jar --spring.profiles.active=test" >> ${DOCKER_FILE}
cat ${DOCKER_FILE}
echo "**Init dockerfile end."

# copy jar to current dockerfile dir
cp /usr/local/www/gs/gs-om-ms/target/${PROJECT_NAME}.jar ${DOCKER_FILE_DIR}/${PROJECT_NAME}.jar

# Build dockerfile
cd ${DOCKER_FILE_DIR}
echo ""
echo "##Build dockerfile for "${DOCKER_NAME}
/usr/bin/docker build -t ${DOCKER_NAME}:${PROJ_VERSION} . 
# Run docker container
echo ""
echo "##Running docker container: "${DOCKER_NAME}
/usr/bin/docker run --name ${DOCKER_NAME}_d1 -d -p ${SPORT}:${DPORT} ${DOCKER_NAME}:${PROJ_VERSION}

 

mvjar.sh脚本如下:

#!/bin/bash
cur_dateTime="`date +%Y-%m-%d-%H%Mss`"
#切换用户到root
sudo -s<<EOF

#将原先的jar备份
mv /usr/local/www/gs/gs-om-ms/target/gs-om-ms.jar /usr/local/www/gs/gs-om-ms/target/gs-om-ms-${cur_dateTime}.jar

#将新构建的jar重命名为运行命令需要的jar
mv /usr/local/www/gs/gs-om-ms/target/gs-om-ms-1.0-SNAPSHOT.jar /usr/local/www/gs/gs-om-ms/target/gs-om-ms.jar

echo "jenkins jar success"
EOF

 

其实上述做的事情就是:

1、将通过SSH PUSH上去的jar进行移动并将以前的jar进行备份

2、删除以前运行的容器及镜像

3、在指定的目录下新建Dockerfile文件,并echo指定的内容

具体的Dockerfile文件内容如下:

FROM jdk
MAINTAINER youpanpan "youpp@xxx.com"
ADD gs-om-ms.jar gs-om-ms.jar
EXPOSE 8988
ENTRYPOINT java -jar gs-om-ms.jar --spring.profiles.active=test

4、将应用jar copy到当前Dockerfile的目录下

5、编译镜像

6、运行镜像

 

注:

ENTRYPOINT有两种格式

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2 

第一种格式中的变量不会被替换,第二种可以,所以这里使用了第二种

echo "ENTRYPOINT java -jar ${PROJECT_NAME}.jar --spring.profiles.active=test" >> ${DOCKER_FILE} 

且必须用双引号括起来,单引号还不行 

 

本人开发的一个网站:编程之道,欢迎来踩!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来了就走下去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值