Files
qing 1ed48a1f48 build(db2,dnfs2): 补齐 Dockerfile 支持容器化部署
- 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 版
2026-08-08 01:59:48 +08:00

98 lines
3.3 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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"]