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 "[email protected]"' >> ${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 "[email protected]"
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} 

且必須用雙引號括起來,單引號還不行 

 

本人開發的一個網站:編程之道,歡迎來踩!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章