mirror of
https://github.com/wanikua/danghuangshang.git
synced 2026-05-06 14:11:17 +08:00
113 lines
3.2 KiB
Docker
113 lines
3.2 KiB
Docker
# syntax=docker/dockerfile:1
|
||
# Platform: linux/amd64, linux/arm64
|
||
# AI 朝廷 · 优化版 Docker 镜像
|
||
# 特点:多阶段构建、层缓存优化、体积减小、安全加固
|
||
|
||
# ============================================
|
||
# 阶段 1: GUI 前端构建
|
||
# ============================================
|
||
FROM node:22-alpine AS gui-builder
|
||
WORKDIR /build
|
||
|
||
# 复制依赖文件(利用 Docker 层缓存)
|
||
COPY gui/package.json gui/package-lock.json ./
|
||
RUN npm ci --loglevel=error
|
||
|
||
# 复制源码并构建
|
||
COPY gui/ ./
|
||
RUN npx tsc -b && npx vite build --emptyOutDir
|
||
|
||
# ============================================
|
||
# 阶段 2: 主镜像
|
||
# ============================================
|
||
FROM node:22-alpine
|
||
|
||
# 元数据
|
||
LABEL maintainer="wanikua" \
|
||
description="AI 朝廷 - 多 Agent 协作框架" \
|
||
org.opencontainers.image.source="https://github.com/wanikua/danghuangshang" \
|
||
org.opencontainers.image.version="3.6.0" \
|
||
org.opencontainers.image.licenses="MIT"
|
||
|
||
# 安装系统依赖(合并为单层减小体积)
|
||
RUN apk add --no-cache \
|
||
bash \
|
||
curl \
|
||
git \
|
||
ca-certificates \
|
||
gnupg \
|
||
chromium \
|
||
jq \
|
||
python3 \
|
||
py3-pip \
|
||
&& rm -rf /var/cache/apk/* \
|
||
&& rm -rf /tmp/*
|
||
|
||
# 环境变量
|
||
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium \
|
||
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
|
||
NODE_ENV=production \
|
||
PYTHONUNBUFFERED=1
|
||
|
||
# 安装 OpenClaw(全局)
|
||
RUN npm install -g openclaw@latest --loglevel=error
|
||
|
||
# 安装 OpenViking(可选,失败不影响构建)
|
||
RUN python3 -m venv /opt/openviking && \
|
||
(/opt/openviking/bin/pip install --no-cache-dir openviking 2>/dev/null && \
|
||
ln -sf /opt/openviking/bin/openviking /usr/local/bin/openviking) || \
|
||
echo "⚠ OpenViking 安装跳过(不影响核心功能)"
|
||
ENV PATH="/opt/openviking/bin:$PATH"
|
||
|
||
# 创建非特权用户(安全加固)
|
||
RUN addgroup -S court && adduser -S court -G court -h /home/court -s /bin/bash
|
||
|
||
# 创建工作目录
|
||
ARG WORKSPACE=/home/court/clawd
|
||
RUN mkdir -p ${WORKSPACE}/memory \
|
||
${WORKSPACE}/skills \
|
||
/home/court/.openclaw \
|
||
/opt/gui/server \
|
||
/opt/skills-dist && \
|
||
chown -R court:court /home/court /opt/gui /opt/skills-dist
|
||
|
||
WORKDIR ${WORKSPACE}
|
||
|
||
# 复制初始化脚本
|
||
COPY docker/entrypoint.sh /entrypoint.sh
|
||
COPY docker/init-docker.sh /init-docker.sh
|
||
RUN chmod +x /entrypoint.sh /init-docker.sh
|
||
|
||
# 复制 GUI 构建产物
|
||
COPY --from=gui-builder /build/dist/ /opt/gui/dist/
|
||
COPY gui/server/ /opt/gui/server/
|
||
COPY gui/package.json /opt/gui/package.json
|
||
|
||
# 安装 GUI 后端依赖
|
||
RUN cd /opt/gui/server && npm ci --omit=dev --loglevel=error && \
|
||
chown -R court:court /opt/gui
|
||
|
||
# 复制 Skills(只读模板)
|
||
COPY skills/ /opt/skills-dist/
|
||
|
||
# 设置所有权
|
||
RUN chown -R court:court /entrypoint.sh /init-docker.sh
|
||
|
||
# 暴露端口
|
||
EXPOSE 18789 18795
|
||
|
||
# 健康检查
|
||
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||
CMD curl -f http://localhost:18789/health || exit 1
|
||
|
||
# 以非特权用户运行
|
||
USER court
|
||
|
||
# 复制入口脚本
|
||
COPY --chown=court:court entrypoint.sh /entrypoint.sh
|
||
RUN chmod +x /entrypoint.sh
|
||
|
||
# 默认命令
|
||
ENTRYPOINT ["/entrypoint.sh"]
|
||
CMD ["openclaw", "gateway", "--verbose"]
|