首页 > 编程语言 >Docker脚本一键打包java镜像运行备份多端口共存

Docker脚本一键打包java镜像运行备份多端口共存

时间:2024-09-12 13:35:05浏览次数:11  
标签:java xxx 一键 port 镜像 NEW Docker server docker

效果

./docker_build.sh 8081 后会创建一个新的8081端口容器,并创建一个8081镜像,并备份之前的镜像

可以启用多个端口

 

结构

 

 

DockerFile


#FROM # 基础镜像,当前新镜像是基于哪个镜像的
#MAINTAINER # 镜像维护者的姓名混合邮箱地址
#RUN # 容器构建时需要运行的命令
#EXPOSE # 当前容器对外保留出的端口
#WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
#ENV # 用来在构建镜像过程中设置环境变量
#ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
#COPY # 类似ADD,拷贝文件和目录到镜像中!
#VOLUME # 容器数据卷,用于数据保存和持久化工作
#CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
#ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
#ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发


FROM adoptopenjdk/openjdk8-openj9

MAINTAINER xxx
# 设置镜像的版本标签
LABEL version="latest"

# 设置镜像构建时间
LABEL build-date="`date -u +"%Y-%m-%dT%H:%M:%SZ"`"

RUN mkdir -p /xxx/server/logs \
/xxx/server/temp \
/xxx/skywalking/agent

WORKDIR /xxx/server

#ENV SERVER_PORT={port}
#
#EXPOSE ${SERVER_PORT}

#当前目录下面的xxx 拷贝到WORKDIR 的admin下面

ADD /xxx /admin



ENTRYPOINT ["java","-jar", "/api/xxx-admin-.jar","--spring.profiles.active=prod"," --server.port={port}"]

docker-compose-server.yml

version: '3'

services:
  xxx-server-{port}:
    image: "xxx-admin-{port}"
    container_name: xxx-admin-{port}
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      SERVER_PORT: {port}
    volumes:
      # 配置文件
      - /logs/admin/{port}:/logs
      # skywalking 探针
    #      - /docker/skywalking/agent/:/xxx/skywalking/agent
    privileged: true
    network_mode: "host"

docker_build.sh

#!/bin/bash

# 检查是否提供了端口号
if [ -z "$1" ]; then
  echo "请提供一个端口号作为参数。"
  echo "用法: $0 <端口号>"
  exit 1
fi

# 获取当前时间戳,格式化为年月日时分秒
TIMESTAMP=$(date +"%Y-%m-%d.%H-%M-%S")


# 获取传入的端口号
PORT=$1

# 定义文件路径
DOCKERFILE="Dockerfile"
DOCKER_COMPOSE_FILE="docker-compose-server.yml"

# 检查 Dockerfile 是否存在
if [ ! -f "$DOCKERFILE" ]; then
  echo "Dockerfile 文件不存在。"
  exit 1
fi

# 检查 docker-compose-server.yml 是否存在
if [ ! -f "$DOCKER_COMPOSE_FILE" ]; then
  echo "docker-compose-server.yml 文件不存在。"
  exit 1
fi


docker tag xxx-admin-$PORT:latest xxx-admin-$PORT:$TIMESTAMP

# 替换 Dockerfile 中的 {port} 并输出到新的文件 Dockerfile-{port}
NEW_DOCKERFILE="Dockerfile-$PORT"
sed "s/{port}/$PORT/g" $DOCKERFILE > $NEW_DOCKERFILE
echo "已生成 $NEW_DOCKERFILE 文件。"

# 替换 docker-compose-server.yml 中的 {port} 并输出到新的文件 docker-compose-server-{port}.yml
NEW_DOCKER_COMPOSE_FILE="docker-compose-server-$PORT.yml"
sed "s/{port}/$PORT/g" $DOCKER_COMPOSE_FILE > $NEW_DOCKER_COMPOSE_FILE
echo "已生成 $NEW_DOCKER_COMPOSE_FILE 文件。"

# 执行 Docker 构建命令,使用新的 Dockerfile 文件
echo "正在使用 $NEW_DOCKERFILE 构建 Docker 镜像..."
docker build --no-cache -f $NEW_DOCKERFILE -t xxx-admin-$PORT:latest .

if [ $? -ne 0 ]; then
  echo "Docker 镜像构建失败。"
  # 删除生成的文件
  rm -f $NEW_DOCKERFILE $NEW_DOCKER_COMPOSE_FILE
  exit 1
fi

# 使用新的 docker-compose-server-{port}.yml 文件运行 docker-compose
echo "正在使用 $NEW_DOCKER_COMPOSE_FILE 启动服务..."
docker-compose -f $NEW_DOCKER_COMPOSE_FILE up -d

if [ $? -ne 0 ]; then
  echo "docker-compose 启动失败。"
  # 删除生成的文件
  rm -f $NEW_DOCKERFILE $NEW_DOCKER_COMPOSE_FILE
  exit 1
fi

# 删除生成的文件
echo "清理临时文件..."
rm -f $NEW_DOCKERFILE $NEW_DOCKER_COMPOSE_FILE
echo "操作完成。"

 

标签:java,xxx,一键,port,镜像,NEW,Docker,server,docker
From: https://www.cnblogs.com/xyzxy/p/18410004

相关文章

  • 010-BUG: org.springframework.cglib.core.CodeGenerationException: java.lang.refle
    参考:Unabletomakeprotectedfinaljava.lang.Classjava.lang.ClassLoader.defineClass-CSDN博客1.完整报错:"msg":"org.springframework.cglib.core.CodeGenerationException:java.lang.reflect.InaccessibleObjectException-->Unabletomakeprotect......
  • 2024年金九银十最新版Java面试题及答案整理(持续更新)
    2024年金九银十到了,发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全~这套互联网Java工程师面试题包括了:MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka面试专......
  • idea中的docker部署配置
    注意:确认本地已安装docker环境第一步:idea安装docker插件:设置-插件-docker第二步:配置Dockerfile文件FROMharbor.chint.com/wz-build-env-public/openjdk:17ASbase#项目的端口,内部服务端口EXPOSE8808#切换到容器内部的/workdir目录WORKDIR/workdir#添加要运行......
  • Java-数据结构-二叉树-基础 (o゚▽゚)o
    文本目录:❄️一、树形结构:  ▶ 1、概念:▶ 2、特殊的概念: ▶ 3、树的表示形式:❄️二、二叉树:  ▶ 1、概念:   ▶2、两种特殊的二叉树:     ➷1)、满二叉树:      ➷ 2)、完全二叉树:  ▶3、二叉树的性质:    ➷ 1)性质一:  ......
  • 5-【JavaWeb】JUnit 单元测试及JUL 日志系统
    1.使用JUnit进行单元测试JUnit是Java中非常流行的单元测试框架,MyBatis与JUnit可以很好地结合,来测试持久层代码的正确性。1.1添加JUnit依赖在使用JUnit之前,需要在pom.xml中引入JUnit依赖。<dependency><groupId>junit</groupId><artifactId>......
  • 6- 【JavaWeb】Maven管理项目
    ApacheMaven是一个流行的构建自动化工具,用于Java项目的构建、管理和依赖处理。Maven使用XML配置文件pom.xml来管理项目的构建过程和依赖关系。1.项目结构一个标准的Maven项目结构如下:my-maven-project/├──src/│├──main/││├──java......
  • 3-【JavaWeb】Lombok配置及使用方法介绍
    Lombok入门教程1.什么是Lombok?Lombok是一个帮助简化Java类中样板代码的Java库。比如,你经常会发现自己重复编写getter和setter方法、构造函数、toString()、equals()和hashCode()方法等。Lombok通过注解来自动生成这些代码,简化开发工作。2.Lombok安装步......
  • Dockerfile 实战指南:轻松掌握容器化部署!
    Dockerfile非常重要,在实际工作中,使用Docker绝不是敲敲一些常用命令即可。Dockerfile几乎贯穿微服务的全部内容,务必掌握。不要求能从头开始编写Dockerfile,至少如果有个Dockerfile的模板,我们能够修改。‍概述Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建......
  • java使用多线程
    importjava.util.concurrent.TimeUnit;importcn.hutool.core.thread.ExecutorBuilder;importcn.hutool.core.thread.ThreadFactoryBuilder;//构造多线程,可修改线程数ExecutorServiceexecutorService=ExecutorBuilder.create().setCorePoolSize(5)//初始线程......
  • 基于 Bootstrap+Echarts +Java SpringBoot 实现数字化水资源监测全景驾驶舱项目
    基于Bootstrap+Echarts+JavaSpringBoot实现数字化水资源监测全景驾驶舱项目,此项目前端采用Bootstrap前端框架,结合javaScrip和echarts以及ajax实现前端页面的展现与后端数据进行交互。后端采用JavaSpringBoot开发后台功能,对数据库增加增删改查等操作,给前端提供数据接口。......