docker常用脚本(Jenkinsfile、dockerfile)

平时对docker运维使用的一些脚本

一、 部署

#!/bin/bash
ID=`docker ps -a | grep "project-name" | awk '{print $1 }'`
if test -z "$ID" ;
then
    echo "NO STARTED-CONTAINERS OF project-name"
else
    docker stop $ID
    echo "STOP CONTAINER ID:" $ID    
fi

二、移除镜像

#!/bin/bash
ID=`docker images | grep "project-name" | awk '{print $3 }'`
if test -z "$ID" ;
then
    echo "$ID"
else
    docker rmi $ID
    echo "docker rmi:" $ID    
fi

三、启动镜像中多个jar(docker-entrypoint.sh,搭配Jenkinsfile+dockerfile使用) 

这里使用的是coding自己集成的Jenkins平台,很多传参不在这里标注,各位可作为脚本编写参考

1、jenkinsfile

pipeline {
  agent any
  stages {
    stage('检出') {
      when {
            not {
              environment name: 'IS_DOCKER_REBUILD', value: 'FALSE'
            }
          }
      steps {
        echo "current branch: ${env.BRANCH_NAME}"
        checkout([
          $class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
          userRemoteConfigs: [[
            url: env.GIT_REPO_URL,
            credentialsId: env.CREDENTIALS_ID
          ]]
        ])
      }
    }
    stage('jar构建') {
      when {
            not {
              environment name: 'IS_DOCKER_REBUILD', value: 'FALSE'
            }
          }
      steps {
        echo 'jar构建中...'
        sh 'gradle build -x test'
        echo 'jar构建完成.'
      }
    }
    stage('docker build') {
      when {
            not {
              environment name: 'IS_DOCKER_REBUILD', value: 'FALSE'
            }
          }
      steps {
        echo 'docker构建中...'
        sh "docker build --build-arg PROJECT1_JAR=project1-${env.APP_VERSION}.jar --build-arg PROJECT2_JAR=project2-${env.APP_VERSION}.jar --build-arg PROJECT3=project3-${env.APP_VERSION}.jar -t ${env.DOCKER_IMAGE_NAME}:${env.APP_VERSION} -f /root/workspace/Dockerfile /root/workspace"
        echo 'docker构建完成.'
      }
    }
    stage('docker镜像推送') {
      when {
            not {
              environment name: 'IS_DOCKER_REBUILD', value: 'FALSE'
            }
          }
      steps {
        sh 'docker images'
        script {
          docker.withRegistry("https://${env.CODING_DOCKER_REG_HOST}", "${env.CODING_ARTIFACTS_CREDENTIALS_ID}") {
          docker.image("${env.DOCKER_IMAGE_NAME}:${env.APP_VERSION}").push()
          }
        }
      }
    }
    stage('docker部署') {
          when {
            not {
              //environment name: 'PROJECT_ENVIRONMENT', value: 'PROD'
              environment name: 'IS_SSH_DEPLOY', value: 'FALSE'
            }

          }
          steps {
            script {
              if ( PROJECT_ENVIRONMENT == "PROD") {
                return
              }
              stage ('Pull & PushImage') {
                def remoteConfig = [:]
                remoteConfig.name = "my-remote-server"
                remoteConfig.allowAnyHosts = true
                remoteConfig.projectName = "${env.PROJECT_NAME}"
                remoteConfig.projectServerPort = "${env.PROJECT_SERVER_PORT}"
                remoteConfig.dockerServerPort = "${env.PROJECT_SERVER_PORT}"
                if("${env.PROJECT_ENVIROMENT}" == "DEV"){
                  remoteConfig.projectEnviroment = "dev"
                  remoteConfig.host = "1.1.1.1"
                  remoteConfig.credentialsId = "e4a40810-dcae-4b97-ab56-3c7298009600"
                  remoteConfig.projectServerARGS = "--spring.profiles.active=dev ${env.PROJECT_SERVER_ARGS}"
                }else if("${env.PROJECT_ENVIROMENT}" == "TEST"){
                  remoteConfig.projectEnviroment = "test"
                  remoteConfig.host = "2.2.2.2"
                  remoteConfig.credentialsId ="d56b2e3c-f422-4bff-9790-cb4058e32100"
                  remoteConfig.projectServerARGS = "--spring.profiles.active=test ${env.PROJECT_SERVER_ARGS}"
                }
                remoteConfig.dockerImageName = "${env.DOCKER_IMAGE_NAME}"
                remoteConfig.jarName = "${env.NEW_JAR_NAME}"
                remoteConfig.dockerImage = remoteConfig.dockerImageName+":${env.APP_VERSION}"
                remoteConfig.dockerRegistryHost = "${env.CODING_DOCKER_REG_DOMAIN}"

                // 使用当前项目下的凭据管理中的 SSH 私钥 凭据
                withCredentials([sshUserPrivateKey(
                  credentialsId: remoteConfig.credentialsId,
                  keyFileVariable: "privateKeyFilePath"
                )]) {

                  // SSH 登陆用户名
                  remoteConfig.user = "${env.REMOTE_USER_NAME}"
                  // SSH 私钥文件地址
                  remoteConfig.identityFile = privateKeyFilePath

                  stage("通过 SSH 执行命令") {
                    // 停止并删除旧的docker容器
                    sshCommand (remote: remoteConfig, command: """
                    ID=`docker ps -a | grep """+remoteConfig.projectName+""" | awk '{print \$1 }'`
                    if [ -z "\$ID" ];
                    then
                    echo "not start"
                    else
                    docker stop \$ID
                    fi
                    """)
                    //sshCommand (remote: remoteConfig, command: 'docker ps -a | grep "project-name" | awk "{print $1 }"|xargs docker rm')
                    sshCommand (remote: remoteConfig, command: 'docker pull '+remoteConfig.dockerRegistryHost+'/'+remoteConfig.dockerImage)
                    sshCommand (remote: remoteConfig, command: 'docker run -d -p 9092:9092 -p 9093:9093 -p 9094:9094  '+'-v /root/jar/project/logs:/opt/kexin/logs'+' '+remoteConfig.dockerRegistryHost+'/'+remoteConfig.dockerImage+' '+remoteConfig.projectEnviroment)
                  }
                }
              }
            }

          }
        }
  }
  environment {
    IS_DOCKER_REBUILD = "${env.IS_DOCKER_REBUILD}"
    IS_SSH_DEPLOY = "${env.IS_SSH_DEPLOY}"
    PROJECT_ENVIRONMENT = "${env.PROJECT_ENVIROMENT}"
    CODING_DOCKER_REG_DOMAIN = "xxxx-docker.pkg.coding.net"
    CODING_DOCKER_REG_HOST = "${env.CCI_CURRENT_TEAM}-docker.pkg.${env.CCI_CURRENT_DOMAIN}"
    DOCKER_IMAGE_NAME = "${env.PROJECT_NAME}/images/${env.DEPOT_NAME}"
  }
}

2、dockerfile

FROM hub.c.163.com/library/java:8
LABEL author="xxxxxx@qq.com"
ARG PROJECT1_JAR
ARG PROJECT2_JAR
ARG PROJECT3_JAR
ENV PROJECT1_JAR $PROJECT1_JAR
ENV PROJECT2_JAR $PROJECT2_JAR
ENV PROJECT3_JAR $PROJECT3_JAR
RUN mkdir /opt/project
WORKDIR /opt/project
COPY ./*/build/libs/project1.jar $PROJECT1_JAR
COPY ./*/build/libs/project2.jar $PROJECT2_JAR
COPY ./*/build/libs/project3.jar $PROJECT3_JAR
RUN ls
COPY docker-entrypoint.sh /usr/local/bin
RUN ln -sf /usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh && sed -i 's/\r//' /usr/local/bin/docker-entrypoint.sh && chmod 777 /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["docker-entrypoint.sh"]

 3、docker-entrypoint.sh

#!/bin/bash

echo "DOCKER RUNNING..."

#run jar
java -jar $DEBUG_OPTS $JAVA_OPTS ./$PROJECT1_JAR '--spring.profiles.active='$1'' $SERVER_OPTS &
sleep 1;
java -jar $DEBUG_OPTS $JAVA_OPTS ./$PROJECT2_JAR '--spring.profiles.active='$1'' $SERVER_OPTS &
sleep 1;
java -jar $DEBUG_OPTS $JAVA_OPTS ./$PROJECT3_JAR '--spring.profiles.active='$1'' $SERVER_OPTS &
sleep 1;

#check the status of service
while true
do
project1_process=`ps aux | grep 'project1' | grep -v grep`;
project2_process=`ps aux | grep 'project2' | grep -v grep`;
project3_process=`ps aux | grep 'project3' | grep -v grep`;

if [[ "$project1_process" == "" ]] && [["$project2_process" == ""]] && [["$project3_process" == ""]]
then
echo "process not exists";
sleep 1;
break;
else
echo "process exists"
fi
done

exec "$@"


版权声明:本文为zky736162010原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。