From 1ed48a1f4826b110066645688c1f5ecc2e74e3ed Mon Sep 17 00:00:00 2001 From: qing <1776177662@qq.com> Date: Sat, 8 Aug 2026 01:59:48 +0800 Subject: [PATCH] =?UTF-8?q?build(db2,dnfs2):=20=E8=A1=A5=E9=BD=90=20Docker?= =?UTF-8?q?file=20=E6=94=AF=E6=8C=81=E5=AE=B9=E5=99=A8=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - db2/Dockerfile: 多阶段构建(libmsg+db2),含 schema 初始化 entrypoint - dnfs2/Dockerfile: 多阶段构建(libhttp+libmsg+dnfs2),curl 健康检查 - .dockerignore: 豁免 libhttp/libmsg 供 C++ 服务构建 两者均基于 ubuntu:24.04(boost 1.83 含 json.hpp),可平替 Python 版 --- .dockerignore | 3 ++ db2/Dockerfile | 90 ++++++++++++++++++++++++++++++++++++++++++++ dnfs2/Dockerfile | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 db2/Dockerfile create mode 100644 dnfs2/Dockerfile diff --git a/.dockerignore b/.dockerignore index 37ecf92..d9ccef6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -51,6 +51,9 @@ bot4cj/ core/ gateway/ lib*/ +# dnfs2 多阶段构建需要 libhttp/libmsg 源码编译 +!libhttp/ +!libmsg/ waf/ captcha/ smtp/ diff --git a/db2/Dockerfile b/db2/Dockerfile new file mode 100644 index 0000000..882ba68 --- /dev/null +++ b/db2/Dockerfile @@ -0,0 +1,90 @@ +# db2 Dockerfile — C++20 数据库 RPC 服务(libmsg + SQLite) +# 多阶段构建:第一阶段编译 libmsg + db2,第二阶段精简运行时 +# +# 注:Debian bookworm 的 boost 版本为 1.74,不含 boost/json.hpp(需 1.75+), +# 因此选用 Ubuntu 24.04(boost 1.83)作为基础镜像。 + +# ============================================================================ +# Stage 1: 构建阶段 +# ============================================================================ +FROM ubuntu:24.04 AS builder + +LABEL maintainer="qingsong" +LABEL service="db2" +LABEL description="数据库 RPC 服务 (C++20) - libmsg + SQLite" + +ENV DEBIAN_FRONTEND=noninteractive + +# 安装构建依赖:g++(C++20)、boost-json、SQLite3 +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + libboost-json-dev \ + libsqlite3-dev \ + make \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /build + +# 复制依赖库源码(.dockerignore 中 lib*/ 已为 libmsg 豁免) +COPY libmsg/ /build/libmsg/ +COPY db2/ /build/db2/ + +# 编译 libmsg(无外部链接依赖) +RUN cd /build/libmsg && make clean && make + +# 编译 db2(覆盖 Makefile 中的 RPATH,使用容器内固定路径) +RUN cd /build/db2 && make clean && make \ + CPP="g++" \ + INCS="-I ../libmsg/inc" \ + LIBS="-L ../libmsg/build -lus_msg -lboost_json -lsqlite3" \ + RPATH="-Wl,-rpath,/app/lib" + +# ============================================================================ +# Stage 2: 运行时阶段 +# ============================================================================ +FROM ubuntu:24.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# 安装运行时依赖(仅动态库)+ sqlite3 CLI(entrypoint 初始化 schema) +RUN apt-get update && apt-get install -y --no-install-recommends \ + libboost-json1.83.0 \ + libsqlite3-0 \ + sqlite3 \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* \ + && useradd -m -u 1000 appuser + +WORKDIR /app + +# 复制构建产物 +COPY --from=builder /build/db2/build/db2 /app/db2 +COPY --from=builder /build/libmsg/build/libus_msg.so /app/lib/libus_msg.so + +# 复制 entrypoint 脚本 +COPY db2/docker-entrypoint.sh /app/docker-entrypoint.sh +RUN chmod +x /app/docker-entrypoint.sh + +# 设置动态库搜索路径 +ENV LD_LIBRARY_PATH=/app/lib + +# 创建数据持久化目录并设置权限 +RUN mkdir -p /app/data && chown -R appuser:appuser /app +VOLUME ["/app/data"] + +USER appuser + +# 暴露端口(与 db 一致) +EXPOSE 8005 + +# 健康检查:TCP 端口探测(db2 是 pymsg TCP 协议,非 HTTP) +HEALTHCHECK --interval=15s --timeout=5s --start-period=5s --retries=3 \ + CMD bash -c 'echo > /dev/tcp/localhost/8005' || exit 1 + +# 默认环境变量(与 docker-compose.yml 中 db 服务对齐) +ENV LISTEN_ADDR=0.0.0.0 \ + LISTEN_PORT=8005 \ + WORKERS=4 \ + DATABASE_URL=sqlite:////app/data/database.db + +ENTRYPOINT ["/app/docker-entrypoint.sh"] diff --git a/dnfs2/Dockerfile b/dnfs2/Dockerfile new file mode 100644 index 0000000..0a98217 --- /dev/null +++ b/dnfs2/Dockerfile @@ -0,0 +1,97 @@ +# dnfs2 Dockerfile — C++20 树状网络文件系统 +# 多阶段构建:第一阶段编译 libhttp + libmsg + dnfs2,第二阶段精简运行时 +# +# 注:Debian bookworm 的 boost 版本为 1.74,不含 boost/json.hpp(需 1.75+), +# 因此选用 Ubuntu 24.04(boost 1.83)作为基础镜像。 + +# ============================================================================ +# Stage 1: 构建阶段 +# ============================================================================ +FROM ubuntu:24.04 AS builder + +LABEL maintainer="qingsong" +LABEL service="dnfs2" +LABEL description="Dendrachy Network File-System (C++20) - 树状网络文件系统" + +ENV DEBIAN_FRONTEND=noninteractive + +# 安装构建依赖:g++(C++20)、boost-json、OpenSSL、libcurl、make +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + libboost-json-dev \ + libssl-dev \ + libcurl4-openssl-dev \ + make \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /build + +# 复制依赖库源码(.dockerignore 中 lib*/ 已为 libhttp/libmsg 豁免) +COPY libhttp/ /build/libhttp/ +COPY libmsg/ /build/libmsg/ +COPY dnfs2/ /build/dnfs2/ + +# 编译 libmsg(无外部链接依赖) +RUN cd /build/libmsg && make clean && make + +# 编译 libhttp(覆盖 Makefile 中 /opt/homebrew 路径,使用系统路径) +RUN cd /build/libhttp && make clean && make \ + CPP="g++" \ + INCS="-I inc" \ + SERVER_LIBS="-lssl -lcrypto -lpthread" \ + CLIENT_LIBS="-lssl -lcrypto -lcurl -lpthread" + +# 编译 dnfs2(链接本地构建的 libhttp/libmsg + 系统 boost/openssl/curl) +RUN cd /build/dnfs2 && make clean && make \ + CPP="g++" \ + INCS="-I ../libhttp/inc -I ../libmsg/inc" \ + LIBS="-L ../libhttp/build -L ../libmsg/build -lus_http -lus_httpclient -lus_msg -lboost_json -lssl -lcrypto -lcurl -lpthread" \ + RPATH="-Wl,-rpath,/app/lib" + +# ============================================================================ +# Stage 2: 运行时阶段 +# ============================================================================ +FROM ubuntu:24.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# 安装运行时依赖(仅动态库,无开发头文件)+ curl(健康检查) +RUN apt-get update && apt-get install -y --no-install-recommends \ + libboost-json1.83.0 \ + libssl3 \ + libcurl4 \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* \ + && useradd -m -u 1000 appuser + +WORKDIR /app + +# 复制构建产物 +COPY --from=builder /build/dnfs2/build/dnfs2 /app/dnfs2 +COPY --from=builder /build/libhttp/build/libus_http.so /app/lib/libus_http.so +COPY --from=builder /build/libhttp/build/libus_httpclient.so /app/lib/libus_httpclient.so +COPY --from=builder /build/libmsg/build/libus_msg.so /app/lib/libus_msg.so + +# 设置动态库搜索路径 +ENV LD_LIBRARY_PATH=/app/lib + +# 设置权限 +RUN chown -R appuser:appuser /app +USER appuser + +# 暴露端口(与 dnfs 一致) +EXPOSE 8006 + +# 健康检查:POST /get_notes {"pid":0} 期望 200 +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD curl -sf -X POST http://localhost:8006/get_notes \ + -H "Content-Type: application/json" \ + -d '{"pid":0}' -o /dev/null || exit 1 + +# 默认环境变量(与 docker-compose.yml 中 dnfs 服务对齐) +ENV LISTEN_ADDR=0.0.0.0 \ + LISTEN_PORT=8006 + +# 启动服务 +CMD ["/app/dnfs2"]