Files
drouter/packaging/docker/Dockerfile
T
liuzhuohua 5150f4c2e6 feat(docker): 补 compose 编排与使用说明,修正镜像标签与 license
新增
  · packaging/docker/docker-compose.yml   现成编排,含健康检查与命名卷
  · packaging/docker/DOCKER-使用说明.md    完整使用文档(含常见问题)
  · devtools/retag-docker-image.py        镜像重打标签工具

修正三个真实缺陷
1. 镜像标签
   原本是 buildah 留下的 `localhost/drouter:1.0.0`。`localhost/` 是 Podman
   的本地镜像约定,Docker 用户拿到会很困惑(像某个私服地址)。
   改为 `drouter:1.0.0` + 别名 `liuzhuohua/drouter:1.0.0`。

2. license 标签写错
   镜像 LABEL 里 `org.opencontainers.image.licenses` 是 **GPL-3.0**,
   但项目实际是 **MIT**(Dockerfile 与镜像 config 都已改)。

3. 缺 HEALTHCHECK
   没有它,compose 里 `depends_on: condition: service_healthy` 无从等起,
   `docker ps` 也看不出容器是否真的活着。
   补上探活 /api/health —— 注意面板走 HTTPS + 自签证书,curl 必须 -k,
   否则永远 unhealthy。

compose 要点
  · network_mode: host 是硬要求(bridge 下看不到真实网卡、管不了宿主 NAT)
  · cap_add 只给 NET_ADMIN + NET_RAW,不用 privileged
  · host 模式下 ports 会被忽略,端口由 /etc/drouter/web-port 决定,
    故用 expose 表达意图而非 ports
  · 四个命名卷必须挂:配置 / 数据 / 快照 / 日志

重打标签采用流式重写 tar(只替换 manifest.json、repositories 与 config
三个小文件,layer.tar 原样透传),已逐层校验 3 个 layer 的 sha256 与
原包完全一致。
2026-09-30 21:25:28 +08:00

76 lines
3.2 KiB
Docker

# =============================================================================
# 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.0
# =============================================================================
FROM debian:trixie-slim
LABEL maintainer="火麒麟 (ajeef) <https://github.com/liuzhuohua>" \
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/
COPY docs/ /opt/drouter/docs/
COPY scripts/*.sh /opt/drouter/scripts/
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"]