# 使用Java 8基础镜像 FROM java:8 LABEL authors="mabh" # 设置时区为Asia/Shanghai,可以根据需要更改 ENV TIME_ZONE=Asia/Shanghai # 更新时区 RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone # 设置容器内的工作目录 WORKDIR /app # 将构建好的Spring Boot应用jar文件复制到镜像中 COPY ./${project.build.finalName}.jar /app/ COPY ./application.yml /app/ COPY ./application-${activatedProperties}.yml /app/ # 暴露端口 EXPOSE 8080 # 设置Java虚拟机初始内存和最大内存 #-server: 启用Java HotSpot虚拟机的服务器模式,该模式针对长时间运行的应用程序进行了优化以提高性能。 #-Xms512m: 设置Java堆的初始大小为512兆字节。 #-Xmx1024m: 设置Java堆的最大大小为1024兆字节。 #-XX:+UseG1GC: 启用G1垃圾收集器。G1(Garbage-First)是一种相对新的垃圾收集器,旨在提供更可预测的停顿时间和更好的性能。 #-XX:+HeapDumpOnOutOfMemoryError: 在发生内存溢出错误时生成堆转储文件。这对于分析内存问题非常有用。 #-XX:HeapDumpPath=/dumps/oom_dump.hprof: 指定内存转储文件。在这个例子中,堆转储文件将被写入 /dumps/oom_dump.hprof 目录文件中。 ENV JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumps/oom_dump.hprof" ENV APP_ENV="--spring.profiles.active=${activatedProperties}" # 创建内存转储文件和日志文件存储目录 RUN mkdir /app/dumps RUN mkdir /app/logs # 设置容器启动时执行的命令 ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dlogging.file=/app/logs/application.log -jar /app/${project.build.finalName}.jar $APP_ENV"]
包含如下基本功能:
以下是它的主要特点和功能:
管理 Docker 容器有时会显得复杂。为此,我们使用 Bash 脚本来简化这一过程。下面是这个脚本的核心要点:
restart.sh
#!/bin/bash # 设置脚本在遇到错误时立即退出 set -e # 设置容器名称和镜像名称 CONTAINER_NAME="${project.build.finalName}" IMAGE_NAME="${project.build.finalName}:1.0.0" # 检查容器是否存在并获取其运行状态 running=$(docker inspect --format="{{ .State.Running }}" "${CONTAINER_NAME}" 2>/dev/null || true) # 停止并删除正在运行的容器 if [ "$running" == "true" ]; then echo "Stopping running container..." docker stop "${CONTAINER_NAME}" echo "Removing stopped container..." docker rm -f "${CONTAINER_NAME}" fi # 如果容器不存在或已停止,重新构建并启动容器 if [ "$running" != "true" ]; then # docker load -i java8.tar echo "Building new image..." docker build -t "${IMAGE_NAME}" . echo "Starting new container..." docker run -d --name "${CONTAINER_NAME}" \ --cap-add=SYS_PTRACE \ -p 8080:8080 \ -v "$(pwd)/dumps:/app/dumps" \ -v "$(pwd)/logs:/app/logs" \ "${IMAGE_NAME}" echo "Container has been restarted." fi
docker load -i java8.tar 这一步对于下面Docker-Compose 可能是需要的。
要将前面提到的 Docker 管理脚本(restart.sh)以及 Dockerfile 与 Maven 打包工具集成,我们可以利用 Maven 的 maven-resources-plugin 插件。这个插件允许我们在 Maven 的构建过程中复制和处理资源文件。下面是如何配置这个插件,以及它在整个过程中的作用:
org.apache.maven.plugins maven-resources-plugin 3.2.0 process-resources resources ${project.build.directory} src/main/resources true Dockerfile restart.sh
如果你看过
动态切换 Spring Boot 打包配置:使用 Maven Profiles 管理 JAR 和 WAR
可以跟 profile 结合起来,只有jar包的的时候才用Docker
jar true jar org.apache.maven.plugins maven-resources-plugin 3.2.0 process-resources resources ${project.build.directory} src/main/resources true Dockerfile restart.sh
通过这种方式,Maven 在构建过程中会自动将 Dockerfile 和 restart.sh 脚本复制到指定的输出目录。这样做的好处是,你可以确保在最终的发版物中包含了这些对于部署和管理 Docker 容器至关重要的文件,实现了项目的一体化管理。
version: '2' services: ${project.build.finalName}: # 使用 Dockerfile 中定义的项目名作为服务名称 image: ${project.build.finalName}:1.0.0 # 使用 Dockerfile 中定义的镜像名和标签 container_name: ${project.build.finalName} # 容器名称也使用同样的命名 ports: - "8080:8080" # 暴露的端口 volumes: - ./${project.build.finalName}.jar:/app/${project.build.finalName}.jar # 挂载 JAR 文件 - ./application.yml:/app/application.yml # 挂载配置文件 - ./application-${activatedProperties}.yml:/app/application-${activatedProperties}.yml # 挂载特定环境的配置文件 - ./dumps:/app/dumps # 挂载内存转储目录 - ./logs:/app/logs # 挂载日志目录 environment: - TIME_ZONE=Asia/Shanghai # 设置时区 - JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumps/oom_dump.hprof - APP_ENV=-Dapp.log.serviceName=${project.build.finalName} --spring.profiles.active=${activatedProperties} restart: always # 设置容器总是自动重启 logging: driver: json-file options: max-size: "20m" max-file: "1"
总的来说,这一套 Docker 化的流程不仅降低了部署复杂性,还提升了效率,为在不同环境中部署应用提供了极大便利。这对于追求快速、可靠且一致的软件部署流程的现代开发团队来说,是一种至关重要的实践。
上一篇:一文读懂 MySQL 中的索引