效果

./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 "操作完成。"