jar包打包成镜像文件
目录结构
主程序
build.sh
#!/bin/bash
# set -x
echo "---------------------------------------------"
echo "1、打包的文件夹与镜像名保持一致"
echo "2、打包的文件夹中必须包含Dockerfile与jar包"
echo "3、Dockerfile中定义的jar包名称与提供的jar包名一致"
echo "---------------------------------------------"
image_name=$1
if [ "$image_name" == "" ]; then
echo "请输入打包的镜像名:"
read input
if [ "$input" == "" ]; then
echo "镜像名不能为空"
exit 1
fi
image_name=$input
fi
shares=()
function read_dir(){
for file in `ls $1`
do
cp -r $1"/"$file $image_name
shares[${#shares[@]}]=$file
done
}
function mv_bak(){
if [ ! -d "$image_name/bak" ]; then
mkdir $image_name"/bak"
fi
for file in ${shares[*]}
do
if [ -d "$image_name/bak/$file" ]; then
rm -rf "$image_name/bak/$file"
fi
mv $image_name"/"$file"/" $image_name"/bak/"
done
}
read_dir share
docker build -t $image_name $image_name
mv_bak
docker image prune -f
input="n"
echo "是否需要导出? (y/n) "
read input
if echo $input | grep -qi "y"; then
bash export.sh $image_name $image_name/${image_name}.tar.gz
else
exit 1
fi
dockerfile依赖,openjdk:8镜像包自行下载,
Dockerfile
FROM openjdk:8
WORKDIR /app/etc/
LABEL USER=HULAN
#名称为你打包的jar
ENV JARNAME=datalook-wechat-ui-2.1.4.RELEASE.jar
COPY ${JARNAME} /app/lib/${JARNAME}
COPY startup.sh /app/bin/startup.sh
RUN chmod +x /app/bin/startup.sh
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENTRYPOINT ["sh","/app/bin/startup.sh"]
运行jar包构建镜像包
startup.sh
set -x
#如果未配置xmx和xms则使用感知功能
if [ ! -z "${XMX}" ] && [ ! -z "${XMS}" ]; then
JAVA_OPT="${JAVA_OPT} -Xmx${XMX} -Xms${XMS}"
fi
JAVA_OPT="${JAVA_OPT} -XX:+HeapDumpOnOutOfMemoryError"
JAVA_OPT="${JAVA_OPT} -XX:HeapDumpPath=/app/etc"
JAVA_OPT="${JAVA_OPT} -XX:+ExitOnOutOfMemoryError"
JAVA_OPT="${JAVA_OPT} -Duser.timezone=GMT+08"
JAVA_OPT="${JAVA_OPT} -Dspring.config.location=/app/etc/"
JAVA_OPT="${JAVA_OPT} /app/lib/${JARNAME}"
java -jar ${JAVA_OPT}
导出镜像包
export.sh
#!/bin/bash
# set -x
image_name=$1
file_name=$2
if [ "$image_name" == "" ]; then
echo "请输入导出镜像名:"
read input
if [ "$input" == "" ]; then
echo "镜像名不能为空"
exit 1
fi
image_name=$input
fi
if [ "$file_name" == "" ]; then
echo "请输入导出的文件名(如:image.tar.gz或path/image.tar.gz):"
read input
if [ "$input" == "" ]; then
echo "导出的文件名不能为空"
exit 1
fi
file_name=$input
fi
echo "准备导出${1}到${2}"
docker save $image_name | gzip -c > $file_name
删除镜像
v8_build_push_rmi.sh
#!/bin/bash
# set -x
#版本后缀年月日时分
cur_date=`date +%Y%m%d%H%M`
harborurl='192.168.16.41:8881/v8/'
isimport='n'
iseDel='y'
exists_image_file(){
file=$1
if [ -f "Dockerfile" ]&&[ "${file##*.}"x = "jar"x ];then
return 0
fi
return 1
}
install(){
echo "--------Start install --------"
echo "------------------------------"
dir=$(ls -l |awk '/^d/ {print $NF}')
for file_name in $dir
do
cd $file_name
echo ""
echo $file_name
echo "++++++++++++++++++++++++++++++++++++"
echo "--------install ${file_name} package--------"
flag="1"
for suf in `ls`
do
exists_image_file "$suf"
if [ $? -eq 0 ]; then
load_tag_push 2>&1 | tee -a $(dirname "$PWD")/load_push.log
flag="0"
break;
fi
done
if [ $flag -eq "1" ]; then
echo "*.jar or Dockerfile was not found"
fi
echo "++++++++++++++++++++++++++++++++++++"
cd ..
done
echo "------------------------------"
echo "---------install end!---------"
}
shares=()
function read_dir(){
for file in `ls ../$1`
do
cp -r ../$1"/"$file ./
shares[${#shares[@]}]=$file
done
}
function mv_bak(){
if [ ! -d "bak" ]; then
mkdir "bak"
fi
for file in ${shares[*]}
do
if [ -d "bak/$file" ]; then
rm -rf "bak/$file"
fi
mv $file"/" "bak/"
done
}
load_tag_push(){
# 创建镜像
echo "Scene start build ${suf}"
read_dir share
docker build -t ${harborurl}$file_name:$cur_date ./../$file_name
if [ $? -eq 0 ]; then
mv_bak
echo "Scene build loaded successfully ${suf}"
echo "Scene start pushed ${suf}"
# 推送镜像
docker push ${harborurl}$file_name:$cur_date > /dev/null
if [ $? -eq 0 ]; then
echo "Scene pushed successfully ${harborurl}$file_name:$cur_date"
if echo $isimport | grep -qi "y"; then
# 导出镜像
echo "Scene start Docker save ${suf}"
docker save ${harborurl}$file_name:$cur_date | gzip -c > $file_name.tar.gz
if [ $? -eq 0 ]; then
echo "Scene save successfully ${harborurl}$file_name:$cur_date"
else
echo "Scene save failed ${harborurl}$file_name:$cur_date"
fi
fi
if echo $iseDel | grep -qi "y"; then
#删除镜像
echo "Scene start Docker rmi ${suf}"
docker rmi --force `docker images | grep ${harborurl} | awk '{print $3}'`
if [ $? -eq 0 ]; then
echo "Scene rmied successfully ${harborurl}$file_name:$cur_date"
else
echo "Images ${harborurl}$file_name:$cur_date failed to rmi"
fi
fi
else
echo "Images ${harborurl}$file_name:$cur_date failed to push"
fi
else
echo "Images ${suf} failed to build load"
fi
}
if [ "$file_name" == "" ]; then
echo "输入文件夹名称:"
read input
if [ "$input" == "" ]; then
echo "文件夹不能为空"
exit 1
fi
echo "Need to Rmi Image? (y/n) "
read iseDel
echo "Need to export Image? (y/n) "
read isimport
if [ "$input" == "all" ];then
install
else
file_name=$input
cd $file_name
echo ""
echo $file_name
echo "++++++++++++++++++++++++++++++++++++"
echo "--------install ${file_name} package--------"
flag="1"
for suf in `ls`
do
exists_image_file "$suf"
if [ $? -eq 0 ]; then
load_tag_push 2>&1 | tee -a $(dirname "$PWD")/load_push.log
flag="0"
break;
fi
done
if [ $flag -eq "1" ]; then
echo "*.jar or Dockerfile was not found"
fi
echo "++++++++++++++++++++++++++++++++++++"
cd ..
fi
fi
打包的镜像包会复制到本地文件夹里面