Spring Boot 镜像构建脚本

Last Modified: 2023/09/07

概述

本文提供 Spring Boot 项目构建 docker 镜像的 Dockerfile 和一个简单的镜像构建脚本。

Spring Boot Dockerfile

假设有个 Spring Boot 项目名为 hello,项目构建后的 jar 文件为 target/hello.jar,Dockerfile 如下:

# Use an OpenJDK base image
FROM openjdk:8-jdk

# Set the working directory in the container
WORKDIR /app

# Copy the packaged JAR file to the container
COPY target/hello.jar ./app.jar

# Set the command to run the Spring Boot application
CMD ["java", "-Dspring.profiles.active=release", "-jar", "app.jar"]

注:Dockerfile 一般放在项目根目录下。

Docker 时区问题

这样制作的镜像在容器运行的时候,时区默认为 UTC,为了时区在国内(东八区)正确,有两种办法:

  • 第一种是传递环境变量 TZ,假设我们要运行一个名为 hello 的容器,方法如下:
    docker run -d --name hello-ci -e TZ=Asia/Shanghai hello
  • 第二种将时区信息写死在 Dockerfile 中,这种方式不太适合公共镜像,但私有镜像没有什么问题。

在 Dockerfile 中写死时区需要知道镜像的 base image。以 linux 为例,必须知道是哪个 Linux 发行版,不同的发行版配置方法不同。

以上面的 Dockerfile 为例,使用的 base image 为 openjdk:8-jdk,这个 base image 是基于 Debian 制作的,因此可以编辑 Dockerfile, 在 FROM openjdk:8-jdk 这一行之后加入以下内容:

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*

注:修改时区还有其他方法,这里不再赘述。

接下来提供一个构建 Docker 镜像的脚本,可以在项目根目录下新建一个 build.sh,通过该脚本可以方便的构建镜像,不用输入一大长串的构建命令,同时还能自动将当前镜像打上 latest 标签。

构建 Docker 镜像的脚本

新建一个构建脚本 build.sh,内容如下:

#! /bin/bash

v=${1}
if [ -z "${v}" ]; then
  echo 'image version required'
  exit 1
fi

# 使用 maven 构建 jar
mvn clean package -Dmaven.test.skip
docker build -t hello:${v} .
# 给当前版本的打个 latest tag
docker tag hello:${v} hello:latest

假设当前镜像需要使用的 tag 为 1.0.0,构建脚本使用方法如下:

./build.sh 1.0.0
有问题吗?点此反馈!

温馨提示:反馈需要登录