build(deploy): 添加多阶段 Dockerfile 以统一构建前后端
引入一个新的多阶段 `Dockerfile.build`,用于将 Flutter 前端和 Spring Boot 后端的构建过程整合到单个 Docker 镜像中。 - 第一阶段使用 Flutter 镜像构建 Web 静态资源。 - 第二阶段使用 Maven 镜像编译 Java 后端应用。 - 最终阶段将前两阶段的产物(Web 资源和 JAR 包)复制到一个精简的 JRE 基础镜像中,以创建最终的运行时镜像。 此变更简化了部署流程,并显著减小了最终生产镜像的体积。`docker-compose.yml` 已同步更新以使用此新的构建文件。
This commit is contained in:
53
deploy/open/Dockerfile.build
Normal file
53
deploy/open/Dockerfile.build
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# Stage 1: Build the Flutter web client
|
||||||
|
FROM cirrusci/flutter:3.22.2 as flutter_builder
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy Flutter project files
|
||||||
|
COPY AINoval/pubspec.yaml AINoval/pubspec.lock ./AINoval/
|
||||||
|
RUN cd AINoval && flutter pub get
|
||||||
|
|
||||||
|
# Copy the rest of the Flutter project source code
|
||||||
|
COPY AINoval/ ./AINoval/
|
||||||
|
|
||||||
|
# Build the Flutter web application
|
||||||
|
RUN cd AINoval && flutter build web --release --web-renderer canvaskit
|
||||||
|
|
||||||
|
# Stage 2: Build the Java Spring Boot server
|
||||||
|
FROM maven:3.9-eclipse-temurin-21 as java_builder
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy only the pom.xml to leverage Docker cache for dependencies
|
||||||
|
COPY AINovalServer/pom.xml ./AINovalServer/
|
||||||
|
RUN mvn -f AINovalServer/pom.xml dependency:go-offline
|
||||||
|
|
||||||
|
# Copy the rest of the server source code
|
||||||
|
COPY AINovalServer/ ./AINovalServer/
|
||||||
|
|
||||||
|
# Build the application, skipping tests to speed up the process
|
||||||
|
RUN mvn -f AINovalServer/pom.xml clean package -DskipTests
|
||||||
|
|
||||||
|
# Stage 3: Create the final runtime image
|
||||||
|
FROM eclipse-temurin:21-jre
|
||||||
|
|
||||||
|
ENV TZ=Asia/Shanghai \
|
||||||
|
LANG=C.UTF-8 \
|
||||||
|
LC_ALL=C.UTF-8 \
|
||||||
|
SPRING_PROFILES_ACTIVE=prod \
|
||||||
|
JVM_XMS=512m \
|
||||||
|
JVM_XMX=512m
|
||||||
|
|
||||||
|
# Fix JDK 21 reflective access for BigDecimal in Spring Data Mongo
|
||||||
|
ENV JAVA_TOOL_OPTIONS="--add-opens=java.base/java.math=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED"
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy the server jar from the java_builder stage and rename it
|
||||||
|
COPY --from=java_builder /app/AINovalServer/target/ai-novel-server-0.0.1-SNAPSHOT.jar /app/ainoval-server.jar
|
||||||
|
|
||||||
|
# Copy the built web assets from the flutter_builder stage
|
||||||
|
COPY --from=flutter_builder /app/AINoval/build/web/ /app/web/
|
||||||
|
|
||||||
|
EXPOSE 18080
|
||||||
|
|
||||||
|
# Serve the prebuilt web from filesystem via Spring static locations
|
||||||
|
CMD sh -c "java -Xms${JVM_XMS} -Xmx${JVM_XMX} -Dfile.encoding=UTF-8 -Dspring.web.resources.static-locations=file:/app/web/ -jar /app/ainoval-server.jar"
|
||||||
@@ -19,7 +19,7 @@ services:
|
|||||||
image: ainoval/ainoval-server:latest
|
image: ainoval/ainoval-server:latest
|
||||||
build:
|
build:
|
||||||
context: ..
|
context: ..
|
||||||
dockerfile: open/Dockerfile
|
dockerfile: open/Dockerfile.build
|
||||||
container_name: ainoval-server
|
container_name: ainoval-server
|
||||||
env_file:
|
env_file:
|
||||||
- ./production.env
|
- ./production.env
|
||||||
|
|||||||
Reference in New Issue
Block a user