From 2ca70b53112aa2c2e0468a319d4d1e4234a42e7d Mon Sep 17 00:00:00 2001 From: wangchuan Date: Thu, 25 Dec 2025 15:21:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Readme.md | 2 + backend/Dockerfile | 28 +++ backend/apprun.sh | 326 ++++++++++++++++++++++++++++++++++ backend/docker-entrypoint.sh | 9 + backend/settings-security.xml | 4 + backend/settings.xml | 318 +++++++++++++++++++++++++++++++++ base/Dockerfile | 24 +++ front/Dockerfile | 18 ++ front/apprun.sh | 283 +++++++++++++++++++++++++++++ 10 files changed, 1013 insertions(+) create mode 100644 .gitignore create mode 100644 Readme.md create mode 100644 backend/Dockerfile create mode 100644 backend/apprun.sh create mode 100644 backend/docker-entrypoint.sh create mode 100644 backend/settings-security.xml create mode 100644 backend/settings.xml create mode 100644 base/Dockerfile create mode 100644 front/Dockerfile create mode 100644 front/apprun.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c8935 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..d20992b --- /dev/null +++ b/Readme.md @@ -0,0 +1,2 @@ +### 简介 +> 本项目主要用于生成前后端项目镜像,无需研发人员介入,只需要按照规范进行版本,打包时Jenkins默认会拉取构建项目进行打包导出镜像。服务默认对外端口为8080,如需透出其他端口在打包后自行修改apprun.sh启动脚本 diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..f692524 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,28 @@ +FROM harbor.zzmjart.com/library/compile:1.0.0 as builder +COPY .git .git +COPY src src +COPY pom.xml . +COPY settings.xml . +RUN mvn -s ./settings.xml clean package -DskipTests=true + + +FROM harbor.zzmjart.com/library/java17:1.0.0 +ARG PROJECTCODE +ARG PROJECTVERSION +LABEL author=wangchuan +COPY docker-entrypoint.sh /usr/local/bin/ +COPY --from=builder /opt/app/target/*.jar $APP_HOME +ENV ENV_ACTIVE="prod" \ + PROJECT_NAME="${PROJECTCODE}" \ + PROJECT_VERSION="${PROJECTVERSION}" \ + JAVA_OPS="" \ + APP_OPS="" \ + SKYWALKING_OPS="" \ + GC_OPS="-XX:+UseG1GC -XX:+UseStringDeduplication -XX:+OptimizeStringConcat -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*=info:file=$LOGS_HOME/gc.log:time,level,tags:filecount=30,filesize=50M -XX:HeapDumpPath=$LOGS_HOME/app.dump" +RUN addgroup -g 1000 1000 && \ + adduser -u 1000 -G 1000 -S -D -H 1000 && \ + chown 1000:1000 -R $APP_HOME $LOGS_HOME && \ + chmod 744 /usr/local/bin/docker-entrypoint.sh && \ + chmod 444 $APP_HOME/*.jar +WORKDIR $APP_HOME +ENTRYPOINT ["docker-entrypoint.sh"] diff --git a/backend/apprun.sh b/backend/apprun.sh new file mode 100644 index 0000000..5dd2c8f --- /dev/null +++ b/backend/apprun.sh @@ -0,0 +1,326 @@ +#!/usr/bin/bash +# 项目名称 +PROJECT_NAME= +# 项目镜像名称 +IMAGE_NAME= +################### 可选配置 ##################### +# 公司名称 +COMPANY_NAME=mingjiang +# 网络名称 +NETWORK_NAME=${COMPANY_NAME}_network +# 服务端口及容器透出端口,多个以,分割,服务端口与透出端口以:进行分割,格式为:服务端口:透出到服务器端口 +# ***** 服务默认第一个端口为注册eureka端口 《《重要》》 ***** +# ***** 必须至少存在一个映射端口 ***** +# SERVER_PORTS=8800:8801,8811 +# SERVER_PORTS=8080 +# java虚拟机配置 +JAVA_OPS="-Xms1024m -Xmx1024m -Xss512k -XX:-UseGCOverheadLimit" +# 链路追踪路径 +SKYWALKING_OPS= +# 项目目录路径 +ROOT_PREFIX_DIR=/usr/local/$COMPANY_NAME +# 是否启用XXL-JOB启动检测,默认不启用 +ENABLE_XXLJOB=0 +# 日志存放路径 +LOG_PATH=$ROOT_PREFIX_DIR/logs/$PROJECT_NAME + + +# 使用说明 +usage() { + echo " + =============================================================================================================== + Usage:sh 执行脚本.sh [update|start|stop|restart|remove|status|version|images] + update:更新镜像 会查询当前是否有.tar.gz的镜像文件,则将镜像加载到镜像列表,文件列表则为镜像名称,并删除镜像文件 + start:启动服务 根据最新镜像版本启动当前服务程序 + stop:停止服务 停止当前服务容器 + restart:重启 停止当前服务容器,并删除容器,并以服务最新镜像拉起服务容器 + remove:删除 删除当前服务容器,就算容器正在运行也会被强制删除 + status:服务状态 查询当前服务是否在运行中,如果在运行则打印出当前运行容器信息 + version:当前版本 查看当前容器使用的镜像版本 + images:服务镜像版本列表 查看当前服务的镜像版本列表 + =============================================================================================================== + " + exit 0 +} + +# 判断是否存在docker容器 +has_docker() { + docker version > /etc/null + if [ $? != 0 ] + then + echo "docker is not install" + exit 1 + fi +} + +# 判断是否存在当前应用的镜像 +has_image() { + c=$(docker images|grep $IMAGE_NAME[[:blank:]]|wc -l) + if [ $c = 0 ] + then + return 1 + fi + return 0 +} + +# 判断是否存在网络连接 +checkOrCreate_network() { + c=$(docker network list|grep "${NETWORK_NAME}[[:blank:]]"|wc -l) + if [ $c = 0 ] + then + docker network create $NETWORK_NAME >/dev/null + fi + return 0 +} + +# 查询清理镜像 +clear_image() { + rows=$(docker images -f reference="$IMAGE_NAME"|wc -l) + if [ $rows -ge 1 ] + then + docker rmi -f $(docker images -f reference="$IMAGE_NAME" -q) + echo "服务 $PROJECT_NAME 容器删除成功" + else + return 0 + fi +} + +# 判断容器是否在运行 +has_run() { + rows=$(docker ps -f name=$PROJECT_NAME\$|wc -l) + if [ $rows -eq 1 ] + then + return 1 + else + return 0 + fi +} + +has_container() { + rows=$(docker ps -a -f name=$PROJECT_NAME\$|wc -l) + if [ $rows -eq 1 ] + then + return 1 + else + return 0 + fi +} + +# 停止运行的jar服务 +stop_jar_run() { + pid=$(ps -ef|grep $PROJECT_NAME-|grep -v grep|awk '{print $2}') + if [ ! -z "$pid" ] + then + kill $pid + fi +} + +# 判断是否有当前服务未启动 +has_stop_container() { + containerId=$(docker ps -a -f name=$PROJECT_NAME\$|grep Exited|awk '{print $1}') + if [ -z "$containerId" ] + then + return 1 + else + return 0 + fi +} + +# 应用端口映射信息处理 +port_map_processor() { + if [ -z "$SERVER_PORTS" ];then + echo "" + fi + portMap="" + IFS=',' read -ra pairs <<< "$SERVER_PORTS" + for pair in "${pairs[@]}"; do + if [[ $pair == *:* ]];then + # 按照冒号分割每个字符串 + IFS=':' read -ra ports <<< "$pair" + portMap="${portMap} -p ${ports[1]}:${ports[0]}" + else + portMap="${portMap} -p ${pair}:${pair}" + fi + done + echo "$portMap" +} + +# 加载镜像 +load_image() { + clear_image + imageFiles=$(ls -1 -v $(pwd)|grep $IMAGE_NAME|grep tar.gz) + for imageFile in ${imageFiles}; do + version=$(echo $imageFile | sed "s/.tar.gz//g" | sed "s/$IMAGE_NAME//g" | sed "s/_//g") + if [ -n "$version" ] + then + echo "服务 $PROJECT_NAME 最新镜像为 $imageFile 版本为 $version" + tar xvf $imageFile + imageName=$(echo $imageFile | sed "s/.gz//g") + if [ -n "$imageName" ] + then + docker load < $imageName + echo "服务 $PROJECT_NAME 镜像 $imageFile 版本为 $version 导入成功" + rm -rf $imageName + fi + fi + done +} + +# 启动容器 +run() { + if [ ! -d "$LOG_PATH" ] + then + mkdir -p $LOG_PATH + fi + stop_jar_run + latestImageId=$(docker images|grep $IMAGE_NAME[[:blank:]]|sort -r|head -1|awk '{OFS=":"}{print $1,$2}') + echo "服务 $PROJECT_NAME 最新镜像ID为 $latestImageId" + has_stop_container + if [ $? = 0 ] + then + containerId=$(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p) + nowImage=$(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $2}'|sed -n 2p) + if [ $nowImage != $latestImageId ] + then + docker rm -f $containerId + else + docker restart $containerId + echo "服务 $PROJECT_NAME 启动成功" + exit 0 + fi + fi + checkOrCreate_network + containerLogPath=/usr/local/$COMPANY_NAME/logs + if [ -e "$(pwd)/.env" ];then + docker run -d -v /etc/localtime:/etc/localtime:ro --env-file .env -e JAVA_OPS="$JAVA_OPS" $(port_map_processor) -v $LOG_PATH:$containerLogPath --network=$NETWORK_NAME --restart=always --name $PROJECT_NAME $latestImageId + echo "启动命令为: docker run -d -v /etc/localtime:/etc/localtime:ro --env-file .env -e JAVA_OPS=\"$JAVA_OPS\" $(port_map_processor) -v $LOG_PATH:$containerLogPath --network=$NETWORK_NAME --restart=always --name $PROJECT_NAME $latestImageId" + else + docker run -d -v /etc/localtime:/etc/localtime:ro -e JAVA_OPS="$JAVA_OPS" $(port_map_processor) -v $LOG_PATH:$containerLogPath --network=$NETWORK_NAME --restart=always --name $PROJECT_NAME $latestImageId + echo "启动命令为: docker run -d -v /etc/localtime:/etc/localtime:ro -e JAVA_OPS=\"$JAVA_OPS\" $(port_map_processor) -v $LOG_PATH:$containerLogPath --network=$NETWORK_NAME --restart=always --name $PROJECT_NAME $latestImageId" + fi +} + +# 更新镜像 +update() { + has_docker + load_image + if [ $? = 0 ] + then + echo "服务 $PROJECT_NAME 更新镜像成功" + fi +} + +# 启动镜像容器 +start() { + has_docker + has_image + if [ $? != 0 ] + then + load_image + has_image + if [ $? != 0 ] + then + echo "服务 $PROJECT_NAME 镜像不存在,启动失败" + exit 1 + fi + fi + has_run + if [ $? != 0 ] + then + run + else + echo "服务 $PROJECT_NAME 容器已在运行中" + fi +} + +# 停止镜像容器 +stop() { + has_docker + has_run + if [ $? = 0 ] + then + docker stop $(docker ps -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p) + echo "服务 $PROJECT_NAME 容器停止成功" + fi +} + +# 重启容器 +restart() { + has_docker + has_run + if [ $? = 0 ] + then + docker rm -f $(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p) + fi + load_image + run +} + +# 删除容器 +remove() { + has_docker + has_container + if [ $? = 0 ] + then + docker rm -f $(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p) + echo "服务 $PROJECT_NAME 容器删除成功" + fi +} + +# 加载当前版本执行状态 +status() { + has_docker + has_run + if [ $? = 0 ] + then + docker ps -f name=$PROJECT_NAME\$ + else + echo "$PROJECT_NAME 未运行" + fi +} + +# 获取当前服务所使用的镜像版本 +version() { + has_docker + has_run + if [ $? = 0 ] + then + echo "当前使用版本为:$(docker ps -f name=$PROJECT_NAME\$ --format {{.Image}})" + fi +} + +# 获取当前服务所存在的镜像版本 +images() { + has_docker + echo "当前使用镜像为:$(docker images|grep $IMAGE_NAME[[:blank:]]|awk '{OFS=":"}{print $1,$2}')" +} + +case "$1" in + "update") + update + ;; + "start") + start + ;; + "stop") + stop + ;; + "restart") + restart + ;; + "remove") + remove + ;; + "status") + status + ;; + "version") + version + ;; + "images") + images + ;; + *) + usage + ;; +esac diff --git a/backend/docker-entrypoint.sh b/backend/docker-entrypoint.sh new file mode 100644 index 0000000..347d5c8 --- /dev/null +++ b/backend/docker-entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/sh +JAR_NAME=$(ls |grep \.jar) +chown -R 1000:1000 $APP_HOME +if [ ! -d "$LOGS_HOME" ];then + gosu 1000 mkdir -p $LOGS_HOME +else + chown -R 1000:1000 $LOGS_HOME +fi +exec gosu 1000 java $JAVA_OPS -server $SKYWALKING_OPS $GC_OPS -Duser.timezone=GMT+08 -jar $APP_HOME/$JAR_NAME --spring.profiles.active=$ENV_ACTIVE $APP_OPS \ No newline at end of file diff --git a/backend/settings-security.xml b/backend/settings-security.xml new file mode 100644 index 0000000..84e8eb7 --- /dev/null +++ b/backend/settings-security.xml @@ -0,0 +1,4 @@ + + + {qBtk71LjY9wHaEzM4sXvM2rQjjSeiagK5Oi2c4koBc8=} + \ No newline at end of file diff --git a/backend/settings.xml b/backend/settings.xml new file mode 100644 index 0000000..a216502 --- /dev/null +++ b/backend/settings.xml @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + maven-public + mingjiang + {PRDE3xgOQZAHLKVHx1c+rFADPZRntXqCd1yr/R9qsK2CmLMM0ZtMQxOkNGyEnsuY} + + + releases + mingjiang + {PRDE3xgOQZAHLKVHx1c+rFADPZRntXqCd1yr/R9qsK2CmLMM0ZtMQxOkNGyEnsuY} + + + snapshots + mingjiang + {PRDE3xgOQZAHLKVHx1c+rFADPZRntXqCd1yr/R9qsK2CmLMM0ZtMQxOkNGyEnsuY} + + + + + + + + maven-public + maven-public + central + https://nexus.zzmjart.com/repository/maven-public/ + + + + + + + + + + default + + true + + + + maven-public + maven-public + https://nexus.zzmjart.com/repository/maven-public/ + + true + fail + daily + + + true + fail + always + + + + + + maven-public + maven-public + https://nexus.zzmjart.com/repository/maven-public/ + + true + fail + daily + + + true + fail + always + + + + + releases::default::https://nexus.zzmjart.com/repository/maven-releases + snapshots::default::https://nexus.zzmjart.com/repository/maven-snapshots + + + + + + default + + diff --git a/base/Dockerfile b/base/Dockerfile new file mode 100644 index 0000000..61e6442 --- /dev/null +++ b/base/Dockerfile @@ -0,0 +1,24 @@ +FROM ghcr.io/graalvm/graalvm-community:25 + +RUN microdnf --refresh -y install findutils openssh-clients + +# common for all images +LABEL org.opencontainers.image.title="Apache Maven" +LABEL org.opencontainers.image.source=https://github.com/carlossg/docker-maven +LABEL org.opencontainers.image.url=https://github.com/carlossg/docker-maven +LABEL org.opencontainers.image.description="Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information." + +ENV MAVEN_HOME=/usr/share/maven + +COPY --from=maven:3.9.12-eclipse-temurin-17 ${MAVEN_HOME} ${MAVEN_HOME} +COPY --from=maven:3.9.12-eclipse-temurin-17 /usr/local/bin/mvn-entrypoint.sh /usr/local/bin/mvn-entrypoint.sh +COPY --from=maven:3.9.12-eclipse-temurin-17 /usr/share/maven/ref/settings-docker.xml /usr/share/maven/ref/settings-docker.xml + +RUN ln -s ${MAVEN_HOME}/bin/mvn /usr/bin/mvn + +ARG MAVEN_VERSION=3.9.12 +ARG USER_HOME_DIR="/root" +ENV MAVEN_CONFIG="$USER_HOME_DIR/.m2" + +ENTRYPOINT ["/usr/local/bin/mvn-entrypoint.sh"] +CMD ["mvn"] \ No newline at end of file diff --git a/front/Dockerfile b/front/Dockerfile new file mode 100644 index 0000000..c51d122 --- /dev/null +++ b/front/Dockerfile @@ -0,0 +1,18 @@ +FROM node:18.20.0-alpine as builder +ARG ENV=prod +WORKDIR /usr/src/app +COPY . . +RUN set -eux; \ + sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories; \ + apk update && apk upgrade; \ + apk add git zlib zlib-dev autoconf automake libtool; \ + apk add yarn; \ + yarn config set registry https://registry.npmmirror.com; \ + yarn --ignore-scripts && yarn build:$ENV; + +FROM harbor.zzmjart.com/library/fileserver:1.0.0 +ARG PROJECTCODE +ARG PROJECTVERSION +ENV PROJECT_NAME="$PROJECTCODE" \ + PROJECT_VERSION="$PROJECTVERSION" +COPY --from=builder /usr/src/app/dist/ /usr/local/app/ \ No newline at end of file diff --git a/front/apprun.sh b/front/apprun.sh new file mode 100644 index 0000000..bbd0c08 --- /dev/null +++ b/front/apprun.sh @@ -0,0 +1,283 @@ +#!/usr/bin/bash +# 项目名称 +PROJECT_NAME= +# 项目镜像名称 +IMAGE_NAME= + +################### 可选配置 ##################### +# 公司名称 +COMPANY_NAME=mingjiang +# 网络名称 +NETWORK_NAME=${COMPANY_NAME}_network + + + +# 使用说明 +usage() { + echo " + =============================================================================================================== + Usage:sh 执行脚本.sh [update|start|stop|restart|remove|status|version|images] + update:更新镜像 会查询当前是否有.tar.gz的镜像文件,则将镜像加载到镜像列表,文件列表则为镜像名称,并删除镜像文件 + start:启动服务 根据最新镜像版本启动当前服务程序 + stop:停止服务 停止当前服务容器 + restart:重启 停止当前服务容器,并删除容器,并以服务最新镜像拉起服务容器 + remove:删除 删除当前服务容器,就算容器正在运行也会被强制删除 + status:服务状态 查询当前服务是否在运行中,如果在运行则打印出当前运行容器信息 + version:当前版本 查看当前容器使用的镜像版本 + images:服务镜像版本列表 查看当前服务的镜像版本列表 + =============================================================================================================== + " + exit 0 +} + +# 判断是否存在docker容器 +has_docker() { + docker version > /etc/null + if [ $? != 0 ] + then + echo "docker is not install" + exit 1 + fi +} + +# 判断是否存在当前应用的镜像 +has_image() { + c=$(docker images|grep $IMAGE_NAME[[:blank:]]|wc -l) + if [ $c = 0 ] + then + return 1 + fi + return 0 +} + +# 判断是否存在网络连接 +checkOrCreate_network() { + c=$(docker network ls|grep "${NETWORK_NAME}[[:blank:]]"|wc -l) + if [ $c = 0 ] + then + docker network create $NETWORK_NAME >/dev/null + fi + return 0 +} + +# 查询清理镜像 +clear_image() { + rows=$(docker images -f reference='$IMAGE_NAME'|wc -l) + if [ $rows -ge 1 ] + then + docker rmi -f $(docker images -f reference='$IMAGE_NAME' -q) + echo "服务 $PROJECT_NAME 容器删除成功" + else + return 0 + fi +} + +# 判断容器是否在运行 +has_run() { + rows=$(docker ps -f name=$PROJECT_NAME\$|wc -l) + if [ $rows -eq 1 ] + then + return 1 + else + return 0 + fi +} + +has_container() { + rows=$(docker ps -a -f name=$PROJECT_NAME\$|wc -l) + if [ $rows -eq 1 ] + then + return 1 + else + return 0 + fi +} + +# 停止运行的jar服务 +stop_jar_run() { + pid=$(ps -ef|grep $PROJECT_NAME-|grep -v grep|awk '{print $2}') + if [ ! -z "$pid" ] + then + kill $pid + fi +} + +# 判断是否有当前服务未启动 +has_stop_container() { + containerId=$(docker ps -a -f name=$PROJECT_NAME\$|grep Exited|awk '{print $1}') + if [ -z "$containerId" ] + then + return 1 + else + return 0 + fi +} + +# 加载镜像 +load_image() { + clear_image + imageFiles=$(ls -1 -v $(pwd)|grep $IMAGE_NAME|grep tar.gz) + for imageFile in ${imageFiles}; do + version=$(echo $imageFile | sed "s/.tar.gz//g" | sed "s/$IMAGE_NAME//g" | sed "s/_//g") + echo "服务 $PROJECT_NAME 最新镜像为 $imageFile 版本为 $version" + tar xvf $imageFile + imageName=$(echo $imageFile | sed "s/.gz//g") + docker load < $imageName + echo "服务 $PROJECT_NAME 镜像 $imageFile 版本为 $version 导入成功" + rm -rf $imageName + done +} + +# 启动容器 +run() { + stop_jar_run + latestImageId=$(docker images|grep $IMAGE_NAME[[:blank:]]|head -1|awk '{OFS=":"}{print $1,$2}') + echo "服务 $PROJECT_NAME 最新镜像ID为 $latestImageId" + has_stop_container + if [ $? = 0 ] + then + containerId=$(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $1}') + nowImage=$(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $2}') + if [ $nowImage != $latestImageId ] + then + docker rm -f $containerId + else + docker restart $containerId + echo "服务 $projectName 启动成功" + exit 0 + fi + fi + docker run -d -v /etc/localtime:/etc/localtime:ro --network=$NETWORK_NAME --restart=always --name $PROJECT_NAME $latestImageId + echo "启动命令为: docker run -d -v /etc/localtime:/etc/localtime:ro --network=$NETWORK_NAME --restart=always --name $PROJECT_NAME $latestImageId" +} + +# 更新镜像 +update() { + has_docker + load_image + if [ $? = 0 ] + then + echo "服务 $PROJECT_NAME 更新镜像成功" + fi +} + +# 启动镜像容器 +start() { + has_docker + checkOrCreate_network + has_image + if [ $? != 0 ] + then + load_image + has_image + if [ $? != 0 ] + then + echo "服务 $PROJECT_NAME 镜像不存在,启动失败" + exit 1 + fi + fi + has_run + if [ $? != 0 ] + then + run + else + echo "服务 $PROJECT_NAME 容器已在运行中" + fi +} + +# 停止镜像容器 +stop() { + has_docker + has_run + if [ $? = 0 ] + then + docker stop $(docker ps -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p) + echo "服务 $PROJECT_NAME 容器停止成功" + fi +} + +# 重启容器 +restart() { + has_docker + has_network + if [ $? != 0 ] + then + create_network + fi + has_run + if [ $? = 0 ] + then + docker rm -f $(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p) + fi + load_image + run +} + +# 删除容器 +remove() { + has_docker + has_run + if [ $? = 0 ] + then + docker rm -f $(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p) + echo "服务 $PROJECT_NAME 容器删除成功" + fi +} + +# 加载当前版本执行状态 +status() { + has_docker + has_run + if [ $? = 0 ] + then + docker ps -f name=$PROJECT_NAME + else + echo "$PROJECT_NAME 未运行" + fi +} + +# 获取当前服务所使用的镜像版本 +version() { + has_docker + has_run + if [ $? = 0 ] + then + echo "当前使用版本为:$(docker ps -f name=$PROJECT_NAME\$ --format {{.Image}})" + fi +} + +# 获取当前服务所存在的镜像版本 +images() { + has_docker + echo "当前使用镜像为:$(docker images|grep $IMAGE_NAME[[:blank:]]|awk '{OFS=":"}{print $1,$2}')" +} + +case "$1" in + "update") + update + ;; + "start") + start + ;; + "stop") + stop + ;; + "restart") + restart + ;; + "remove") + remove + ;; + "status") + status + ;; + "version") + version + ;; + "images") + images + ;; + *) + usage + ;; +esac \ No newline at end of file