效果
./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