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

102 lines
3.4 KiB
Docker

# syntax=docker/dockerfile:1
# 构建上下文为项目根目录;使用已固定的上游子模块源码。
FROM golang:1.24-alpine AS build
WORKDIR /src
COPY modules/xiaohongshu-mcp/go.mod modules/xiaohongshu-mcp/go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
COPY modules/xiaohongshu-mcp/ ./
# 静态编译 MCP,移除调试信息;依赖与编译缓存不进入运行镜像。
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/mcp .
FROM debian:bookworm-slim AS browser
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates curl xz-utils \
&& rm -rf /var/lib/apt/lists/*
# 与 Go 端读取同一版本文件,下载后校验上游 SHA256。
COPY modules/xiaohongshu-mcp/browser/browser_version.txt /tmp/browser-version
# Rod 通过 CDP 连接浏览器,不需要 ChromeDriver;语言包只保留中文和英文。
RUN set -eu; \
version="$(tr -d '[:space:]' </tmp/browser-version)"; \
base="https://cdn.one-world.ai/browsers/${version}"; \
destination="/browser/xiaohongshu-mcp/browser/${version}"; \
mkdir -p "$destination"; \
curl -fSL --retry 3 "$base/linux-x64.tar.xz" -o /tmp/browser.tar.xz; \
curl -fsSL --retry 3 "$base/SHA256SUMS" -o /tmp/SHA256SUMS; \
awk '$2 == "linux-x64.tar.xz" {print $1 " /tmp/browser.tar.xz"}' /tmp/SHA256SUMS >/tmp/browser.sha256; \
test -s /tmp/browser.sha256; \
sha256sum -c /tmp/browser.sha256; \
tar -xJf /tmp/browser.tar.xz -C "$destination" --strip-components=1; \
test -x "$destination/chrome"; \
if [ -d "$destination/locales" ]; then \
find "$destination/locales" -type f \
! -name 'en-US.pak' ! -name 'zh-CN.pak' -delete; \
fi; \
rm -f "$destination/chromedriver"
# 安装内置浏览器的动态依赖以及中文、Emoji 字体。
FROM debian:bookworm-slim AS runtime
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
fonts-noto-color-emoji \
fonts-wqy-zenhei \
libasound2 \
libatk-bridge2.0-0 \
libatk1.0-0 \
libcairo2 \
libcups2 \
libdrm2 \
libgbm1 \
libnspr4 \
libnss3 \
libpango-1.0-0 \
libx11-xcb1 \
libxcomposite1 \
libxdamage1 \
libxfixes3 \
libxkbcommon0 \
libxrandr2 \
&& rm -rf /var/lib/apt/lists/* \
&& groupadd --gid 10001 upup \
&& useradd --uid 10001 --gid upup --no-create-home upup \
&& mkdir -p /app/data/home /app/data/config /app/images \
&& chown -R upup:upup /app
WORKDIR /app
COPY --from=build /out/mcp /usr/local/bin/xiaohongshu-mcp
COPY --from=browser /browser /opt/browser
# 缺少浏览器依赖时在构建阶段报错。
RUN ldd /opt/browser/xiaohongshu-mcp/browser/*/chrome >/tmp/browser-libraries \
&& ! grep -q 'not found' /tmp/browser-libraries \
&& rm /tmp/browser-libraries
# 浏览器二进制留在镜像中,避免被数据卷覆盖;登录态与用户配置写入数据卷。
ENV XDG_CACHE_HOME=/opt/browser \
HOME=/app/data/home \
XDG_CONFIG_HOME=/app/data/config \
COOKIES_PATH=/app/data/cookies.json
USER upup
EXPOSE 18060
HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \
CMD curl -fsS http://127.0.0.1:18060/health >/dev/null || exit 1
ENTRYPOINT ["/usr/local/bin/xiaohongshu-mcp"]