平时对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 = privateKeyFilePathstage("通过 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
doneexec "$@"