构建:新增完整容器化部署

This commit is contained in:
Zhu Junhao
2026-09-04 15:30:58 +08:00
parent 99d16bb3b9
commit 595c8da595
11 changed files with 335 additions and 31 deletions

6
server/.dockerignore Normal file
View File

@@ -0,0 +1,6 @@
target
.idea
*.iml
*.log
.env
.env.*

37
server/Dockerfile Normal file
View File

@@ -0,0 +1,37 @@
# syntax=docker/dockerfile:1
# Maven 构建阶段使用与项目一致的 JDK 21并利用 BuildKit 缓存减少重复下载依赖的时间。
FROM maven:3.9.13-eclipse-temurin-21 AS builder
WORKDIR /workspace
COPY pom.xml ./
COPY src ./src
# 直接打包只解析项目真正需要的依赖;独立 go-offline 会额外下载大量未参与构建的报告插件。
RUN --mount=type=cache,target=/root/.m2 mvn -B -DskipTests package
# AgentScope DockerSandbox 通过 docker 命令创建 Runtime直接复用官方镜像中的 CLI 二进制。
FROM docker:29-cli AS docker-cli
FROM eclipse-temurin:21-jre-jammy
# curl 用于容器健康检查gosu 用于完成目录和 Docker Socket 权限初始化后降权运行 Java。
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates curl gosu \
&& rm -rf /var/lib/apt/lists/*
COPY --from=docker-cli /usr/local/bin/docker /usr/local/bin/docker
RUN groupadd --gid 10001 manuagent \
&& useradd --uid 10001 --gid 10001 --create-home --shell /bin/bash manuagent \
&& mkdir -p /opt/manuagent /srv/manuagent/data \
&& chown -R manuagent:manuagent /opt/manuagent /srv/manuagent
WORKDIR /opt/manuagent
COPY --from=builder /workspace/target/*.jar app.jar
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod 0755 /usr/local/bin/docker-entrypoint.sh
EXPOSE 8080
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["java", "-XX:MaxRAMPercentage=75.0", "-Djava.security.egd=file:/dev/urandom", "-jar", "/opt/manuagent/app.jar"]

View File

@@ -0,0 +1,25 @@
#!/bin/sh
set -eu
# Agent Runtime 的目录通过宿主机 Docker daemon 再次挂载,因此后端必须能写入共享数据根目录。
data_root="${APP_DATA_ROOT:-/srv/manuagent/data}"
mkdir -p "$data_root"
chown manuagent:manuagent "$data_root"
# Docker Socket 的组 ID 在不同 Linux 发行版和 Docker Desktop 中并不固定。
# 启动时读取真实组 ID 并把低权限应用用户加入对应组,避免以 root 身份运行 Spring Boot。
docker_socket="/var/run/docker.sock"
if [ ! -S "$docker_socket" ]; then
echo "错误:未挂载 $docker_socket,后端无法创建 Agent Runtime 容器。" >&2
exit 1
fi
docker_gid="$(stat -c '%g' "$docker_socket")"
docker_group="$(getent group "$docker_gid" | cut -d: -f1 || true)"
if [ -z "$docker_group" ]; then
docker_group="docker-host"
groupadd --gid "$docker_gid" "$docker_group"
fi
usermod -aG "$docker_group" manuagent
exec gosu manuagent "$@"