# ============================================================================= # drouter —— Docker 镜像 # # 定位:用于「快速体验 / 开发调试 / CI 渲染校验」。 # 真正当主路由跑,请直接装在 Debian 13 物理机或虚拟机里(需要直接操作网卡与 # nftables,容器只能以 --network host + NET_ADMIN 勉强模拟)。 # # 构建:bash packaging/build-docker.sh [tag] # 运行:docker run -d --name drouter \ # --network host --cap-add NET_ADMIN --cap-add NET_RAW \ # -v drouter-data:/opt/drouter/data \ # -v drouter-etc:/etc/drouter \ # drouter:1.0.8 # ============================================================================= FROM debian:trixie-slim LABEL maintainer="火麒麟 (ajeef) " \ org.opencontainers.image.title="drouter" \ org.opencontainers.image.description="Debian 13 主路由管理系统(Web 管理面板)" \ org.opencontainers.image.licenses="MIT" ENV DEBIAN_FRONTEND=noninteractive \ PYTHONUNBUFFERED=1 \ TZ=Asia/Shanghai # 1) 依赖。只装运行 Web 面板与渲染配置所必需的包; # 不装 dnsmasq/radvd —— 容器里默认不启动,装了也不会跑。 RUN apt-get update && apt-get install -y --no-install-recommends \ python3 \ nftables \ iproute2 \ iputils-ping \ ethtool \ conntrack \ bridge-utils \ sqlite3 \ curl \ procps \ sudo \ openssl \ ca-certificates \ tzdata \ && rm -rf /var/lib/apt/lists/* # 2) 程序文件 RUN mkdir -p /opt/drouter/backend /opt/drouter/web /opt/drouter/docs \ /opt/drouter/data /opt/drouter/snapshots /opt/drouter/certs \ /opt/drouter/scripts /opt/drouter/bin \ /etc/drouter/generated /etc/drouter/themes \ /var/log/drouter /run/drouter-helper COPY backend/*.py /opt/drouter/backend/ COPY web/ /opt/drouter/web/ # 只拷顶层 .md:docs/screenshots/ 是给 GitHub README 用的 78 张截图, # 进镜像纯属白白撑大体积 COPY docs/*.md /opt/drouter/docs/ COPY scripts/*.sh /opt/drouter/scripts/ # 版本号(唯一真源)。页面底部与 openapi 的 version 字段都读它 —— # 不拷的话容器里只能退回硬编码兜底值,镜像 tag 是 1.0.9 页面却显示 1.0.8。 COPY packaging/VERSION /opt/drouter/VERSION COPY packaging/docker/docker-init.sh /opt/drouter/bin/docker-init.sh RUN chmod +x /opt/drouter/bin/docker-init.sh /opt/drouter/scripts/*.sh # 3) 运行用户(容器里以低权用户跑 Web,写 /etc 走 helper 白名单) RUN useradd -r -s /usr/sbin/nologin -d /opt/drouter -M drouter \ && printf 'drouter ALL=(root) NOPASSWD: /usr/bin/python3 /opt/drouter/backend/drouter-helper.py *\n' \ > /etc/sudoers.d/drouter \ && chmod 0440 /etc/sudoers.d/drouter \ && chown -R drouter:drouter /opt/drouter/data /opt/drouter/snapshots /opt/drouter/certs /var/log/drouter \ && chmod 700 /run/drouter-helper EXPOSE 8080 8443 VOLUME ["/opt/drouter/data", "/opt/drouter/snapshots", "/etc/drouter", "/var/log/drouter"] # 端口要跟着实际配置走,写死 8443 会在用户改端口后一直报 unhealthy HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ CMD curl -sk "https://127.0.0.1:$(cat /etc/drouter/web-port 2>/dev/null || echo 8443)/api/health" \ || exit 1 ENTRYPOINT ["/opt/drouter/bin/docker-init.sh"] CMD ["/usr/bin/python3", "/opt/drouter/backend/drouter-web.py"]