通用的将jar制作成docker镜像sh脚本

通用的将jar制作成docker镜像sh脚本

为了在将 JAR 制作成 Docker 镜像的过程中创建日志目录,可以对之前的脚本进行扩展。以下是改进后的脚本,会在镜像构建时在容器内创建日志目录,并将日志文件挂载到该目录下。

  1. 在生成的 Dockerfile 中添加创建日志目录的命令。
  2. 在启动 JAR 应用时,将日志输出到该日志目录。

脚本代码

bash 复制代码
#!/bin/bash

# 检查参数数量
if [ $# -ne 4 ]; then
    echo "用法: $0 <jar文件路径> <镜像名称> <镜像版本> <日志文件名>"
    exit 1
fi

# 获取输入参数
JAR_FILE=$1
IMAGE_NAME=$2
IMAGE_VERSION=$3
LOG_FILE_NAME=$4

# 检查 JAR 文件是否存在
if [ ! -f "$JAR_FILE" ]; then
    echo "错误: 指定的 JAR 文件 $JAR_FILE 不存在。"
    exit 1
fi

# 获取 JAR 文件名
JAR_FILENAME=$(basename "$JAR_FILE")

# 日志目录名
LOG_DIR="/app/logs"

# 生成 Dockerfile
cat << EOF > Dockerfile
# 使用官方的 OpenJDK 基础镜像
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 创建日志目录
RUN mkdir -p $LOG_DIR

# 将 JAR 文件复制到工作目录
COPY $JAR_FILE /app/

# 暴露应用程序使用的端口,可根据实际情况修改
EXPOSE 8080

# 定义启动命令,将日志输出到指定日志文件
CMD ["sh", "-c", "java -jar $JAR_FILENAME > $LOG_DIR/$LOG_FILE_NAME 2>&1"]
EOF

# 构建 Docker 镜像
docker build -t $IMAGE_NAME:$IMAGE_VERSION .

# 检查构建是否成功
if [ $? -eq 0 ]; then
    echo "Docker 镜像 $IMAGE_NAME:$IMAGE_VERSION 构建成功。"
else
    echo "Docker 镜像构建失败。"
fi

# 删除生成的 Dockerfile
rm Dockerfile

代码解释

  1. 日志目录定义 :LOG_DIR="/app/logs" 定义了容器内的日志目录路径。
  2. 在 Dockerfile 中创建日志目录 :RUN mkdir -p $LOG_DIR 在容器构建时创建日志目录,-p 选项确保即使父目录不存在也会一并创建。
  3. 日志输出重定向 :CMD ["sh", "-c", "java -jar $JAR_FILENAME > $LOG_DIR/自定义.log 2>&1"] 将 JAR 应用的标准输出和标准错误输出都重定向到 $LOG_DIR/自定义.log 文件中。

使用方法

  1. 保存脚本为 build_jar_image.sh。
  2. 赋予执行权限:
bash 复制代码
chmod +x build_jar_image.sh
  1. 运行脚本,替换相应参数:
bash 复制代码
./build_jar_image.sh <jar文件路径> <镜像名称> <镜像版本> <日志文件名>

示例

假设你的 JAR 文件路径为 /path/to/your/app.jar,镜像名称为 myapp-image,镜像版本为 1.0,日志文件名为 app.log,则可以使用以下命令构建镜像:

bash 复制代码
./build_jar_image.sh /path/to/your/app.jar myapp-image 1.0 app.log

这样,在基于该脚本构建的 Docker 镜像运行时,JAR 应用产生的日志就会被记录到容器内的 /app/logs/app.log 文件中。

相关推荐
Wx-bishekaifayuan4 小时前
springboot房屋租赁系统11574-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·sql·spring·课程设计
小白的码BUG之路4 小时前
Docker -- 构建nginx镜像,启动vue项目
vue.js·nginx·docker
guo_wen_qiang4 小时前
docker安装常见软件集合
运维·docker·容器
三8444 小时前
Fastjson 漏洞学习笔记 · 03 · 经典利用链:TemplatesImpl 与 JdbcRowSetImpl
java·web安全·fastjson
蜗牛互联网5 小时前
GPT-6.1 Sol迁移指南:从token单价转向每任务成本门禁
java·人工智能·后端·gpt
蜗牛互联网5 小时前
HSTU在Dynamo-Triton中的AOTI与KV缓存验收方法
java·人工智能·后端·缓存
Sirens.5 小时前
Java多线程实例:单例模式、阻塞队列、线程池与定时器
java·开发语言·单例模式
青山木5 小时前
秒杀系统设计(一):需求拆解与流量治理
java·数据库·redis·后端·架构
卓怡学长5 小时前
w195基于ssm“Fitfrend”个性化健身
java·intellij-idea
驭渊的小故事5 小时前
算法实战:滑动窗口、素数枚举与字符串模拟(三道经典题解)
java·算法