其實不集成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}
且必須用雙引號括起來,單引號還不行
本人開發的一個網站:編程之道,歡迎來踩!!!