Files
upup/docker/app.Dockerfile
chuan b9ddb5e21e feat: 支持精简 Docker Compose 部署
- 集中维护 Dockerfile,使用多阶段构建和 Bun 独立可执行文件
- 提供 MCP 浏览器镜像,保留中文与 Emoji 字体并校验下载完整性
- 配置健康检查、非 root 运行、内部网络和持久化数据卷
- 增加容器端到端验证脚本,覆盖模型调用、浏览器启动及数据恢复
- 重组 README,精简部署、配置和开发说明
2026-10-25 01:13:47 +08:00

47 lines
1.3 KiB
Docker

# syntax=docker/dockerfile:1
# 构建上下文为项目根目录;依赖版本与 bun.lock 保持一致。
FROM oven/bun:1.3.14-alpine AS build
WORKDIR /build
COPY package.json bun.lock ./
RUN --mount=type=cache,target=/root/.bun/install/cache \
bun install --frozen-lockfile
COPY tsconfig.json vite.config.ts index.html index.ts ./
COPY src ./src
# 前端生成静态资源,后端编译为包含 Bun 运行时的独立程序。
RUN bun run build \
&& bun build --compile --minify --outfile /out/upup index.ts
# 运行镜像只复制程序和前端资源。
FROM alpine:3.23 AS runtime
RUN apk add --no-cache ca-certificates libgcc libstdc++ \
&& addgroup -g 10001 upup \
&& adduser -D -u 10001 -G upup upup \
&& mkdir -p /app/data /app/images \
&& chown -R upup:upup /app
WORKDIR /app
COPY --from=build /out/upup /usr/local/bin/upup
COPY --from=build /build/dist/client ./dist/client
ENV NODE_ENV=production \
HOST=0.0.0.0 \
PORT=3000 \
DATA_DIR=/app/data
# 数据卷初始化时沿用目录权限,应用以非 root 用户运行。
USER upup
EXPOSE 3000
HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \
CMD wget -q -O /dev/null "http://127.0.0.1:${PORT}/api/health" || exit 1
ENTRYPOINT ["/usr/local/bin/upup"]