🐳 SpringBoot 部署本地 Docker
2025-01-22 08:19:30    555 字   
This post is also available in English and alternative languages.

SpringBoot 项目部署本地 Docker,不占用测试、DEV环境,方便本地联调。


1. 项目

示例项目没有什么代码,就一个 task 类。多个配置文件是演示通过启动参数读取不同的配置文件。

项目结构

2. 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Slf4j
@Component
public class ExampleTask implements ApplicationRunner {

@Value("${data.name}")
private String name;

@Value("${data.msg}")
private String msg;

@Override
public void run(ApplicationArguments args) throws Exception {
simpleTest();
}

public void simpleTest() throws Exception {

log.info("-----> name:{}", name);
log.info("-----> msg:{}", msg);

String uavString = IOUtils.toString(new ClassPathResource("data/uav.json").getInputStream(), StandardCharsets.UTF_8);
String nestString = IOUtils.toString(new ClassPathResource("data/nest.json").getInputStream(), StandardCharsets.UTF_8);

JSONObject result = new JSONObject();
result.put("uav", JSONObject.toJSONString(uavString));
result.put("nest", JSONObject.toJSONString(nestString));

log.info("result:{}", result.toJSONString());
}
}

3. 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# application.yml
spring:
application:
name: springboot-example-docker
profiles:
active: ${SPRING_PROFILES_ACTIVE:local} # 默认读取 local 文件
data:
msg: 'this param from application.yml'
server:
port: 9401
servlet:
context-path: /api/docker

# --------------------------------------------------

# application-docker.yml
data:
name: 'this is docker properties'

# --------------------------------------------------

# application-local.yml
data:
name: 'this is local properties'

4. dockerFile

我的电脑是M芯片的,注意替换对应版本的JDK。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Apple Silicon arm64
FROM azul/zulu-openjdk:8u322

# 设置工作目录为 /app。这意味着所有后续的命令都会在此目录下执行。
WORKDIR /app

# 暴露端口 18088,这样在容器运行时,外部可以访问这个端口。
EXPOSE 9400

ENV SPRING_PROFILES_ACTIVE=docker

# 将构建输出的 JAR 文件添加到容器中的 /app 目录下并命名为 app.jar
ADD ./target/springboot-example-docker-1.0.jar ./app.jar

# 设置 Java 环境变量,包括在发生内存溢出时生成堆转储文件的路径
ENV JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/app-heapdump.hprof"

# 使用 java 命令启动 Spring Boot 应用
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar

5. 编译&打包

以上内容都准备好以后,再进行下面操作:

  • 编译打包:mvn clean compile install
  • 打包镜像
    • amd64:docker build -t springboot-example-docker .
    • arm64(M芯片):docker build --platform linux/arm64 -t springboot-example-docker .
编译&打包

6. 启动镜像

  • 设置 SPRING_PROFILES_ACTIVElocal,读取 application-local.yml 配置文件。

    1
    2
    3
    4
    docker run -p 9401:9401 \
    -e SPRING_PROFILES_ACTIVE=local \
    --name springboot-example-docker \
    springboot-example-docker
    启动镜像,读取local配置

  • 设置 SPRING_PROFILES_ACTIVE 为 docker,读取 application-docker.yml 配置文件。

    1
    2
    3
    4
    docker run -p 9401:9401 \
    -e SPRING_PROFILES_ACTIVE=docker \
    --name springboot-example-docker \
    springboot-example-docker
    启动镜像,读取docker配置