1、构建Docker容器
首先编写 Dockerfile,将后端项目打包为 Docker 容器镜像。
Dockerfile 是一个文本配置文件,包含一系列指令,用干自动化构建 Docker 容器镜像。我们需要在 Dockerfile 中定义:
- 基础环境(比如预装 JDK 的 Linux 系统)
- 有哪些原始文件?(比如项目源代码)
- 如何构建项目?(比如 maven package命令打包)
- 如何启动项目?(比如 java -jar 命令).
2、两种编写方式
1、运行时打包。只把源代码复制到 Docker 工作空间中,在构造镜像时执行Maven打包。
java
# 使用预装 Maven 和 JDK21 的镜像
FROM maven:3.9-amazoncorretto-21
WORKDIR /app
# 只复制必要的源代码和配置文件
COPY pom.xml .
COPY src ./src
# 使用 Maven 执行打包
RUN mvn clean package -DskipTests
# 暴露应用端口
EXPOSE 8123
# 使用生产环境配置启动应用
CMD ["java", "-jar", "/app/target/yuAn-ai-agent-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=prod"]
简单来说,就是在构建 Docker 镜像的时候,动态地在容器内完成应用代码的编译打包操作。不是在本地先把 jar 包生成好再 copy 进去。而是 把代码 copy 到 Docker 镜像里,在构建镜像时去编译、打包。打包动作和镜像构建一步到位。
2、预打包
提前在自己的电脑上把 jar 包构建好,直接把得到的 target 目录下的 jar 包复制到 Docker 工作空间中,无需在构造镜像时打包。
java
# 使用轻量级 JDK21 运行环境
FROM openjdk:21-slim
# 工作目录
WORKDIR /app
# 复制已经打包好的JAR文件(假设已放在当前目录)
COPY target/yu-ai-agent-0.0.1-SNAPSHOT.jar app.jar
# 暴露应用端口
EXPOSE 8123
# 使用生产环境配置启动应用
CMD ["java", "-jar", "app.jar", "--spring.profiles.active=prod"]
总结:
第一段:
源码 + Dockerfile ------> 构建镜像(包含打包过程) ------> 镜像(大)
第二段:
源码 ------> 本地打 jar ------> jar + Dockerfile ------> 构建镜像(不打包) ------> 镜像(小)
比较:
第一种方式的优点是更加自动化,不用每次部署项目都手动打jar 包,减少人工部署的成本和误差,但缺点是每次构建镜像时都要拉取 Maven 依赖,耗时更长。可以优先选择第一种方式,如果 Serverless 平台在构建镜像的过程中耗时过长、或者无法拉取依赖,那么再选择第二种方式。