chore: 规范标点

This commit is contained in:
pluv committed 2026-10-03 14:56:56 +08:00
1 parent 15e79887fa
commit 3dd2231c70
81 files changed
+1751 -1751

No files matched your search

+14 -14
View File
@@ -1,12 +1,12 @@
# Dockerfile - 构建完全静态的 ligent
#
# 用法 (podman 和 docker 都行, 命令一样):
# 用法 (podman 和 docker 都行, 命令一样):
#
# podman build -t ligent-static .
# podman run --rm ligent-static --version
# podman create --name tmp ligent-static && podman cp tmp:/ligent-static . && podman rm tmp
#
# 或者直接跑 make 目标:
# 或者直接跑 make 目标:
# make docker-build # 构建镜像
# make docker-extract # 把产物拷到当前目录 (./ligent-static)
#
@@ -21,7 +21,7 @@
# musl 目标, 省掉了"装 musl 工具链 + 配 spec 文件"这一整段麻烦,
# 而且 musl-gcc 这个包装脚本在 Alpine 上根本不存在也不需要.
#
# 具体地:Alpine 的 gcc 默认 `--target=x86_64-alpine-linux-musl`,
# 具体地: Alpine 的 gcc 默认 `--target=x86_64-alpine-linux-musl`,
# 所以 tools/build-static-deps.sh 里的 CC 检测会落到 x86_64-linux-musl-gcc
# 分支 (我们显式给它 CC=cc), 产出的 .a 天然就是 musl 的.
#
@@ -36,7 +36,7 @@
# 关于构建缓存
# ------------
# 依赖的编译 (OpenSSL 那步最慢, 几分钟)单独占一层, 且只依赖脚本本身.
# 源码 COPY 放在它后面:改一行 C 代码不会让"重编 OpenSSL"这件事再发生一遍.
# 源码 COPY 放在它后面: 改一行 C 代码不会让"重编 OpenSSL"这件事再发生一遍.
# 这是这个 Dockerfile 里唯一一处为了速度而做的结构调整, 值得.
# ------------------------------------------------------------------ 构建阶段
@@ -64,7 +64,7 @@ WORKDIR /src
# .dockerignore 把 .git 排除了, 容器里本来也看不到它.
COPY tools/build-static-deps.sh /src/tools/build-static-deps.sh
# CC=cc:Alpine 的 cc 就是 musl 目标的 gcc, 不需要 musl-gcc 包装脚本.
# CC=cc: Alpine 的 cc 就是 musl 目标的 gcc, 不需要 musl-gcc 包装脚本.
# 这一步会联网下载并编译 zlib + OpenSSL + curl, 约几分钟.
RUN CC=cc sh /src/tools/build-static-deps.sh
@@ -74,7 +74,7 @@ COPY Makefile /src/Makefile
COPY tools/get-version.sh /src/tools/get-version.sh
# 版本号由外面注入. 容器里没有 .git, get-version.sh 会回退到源码文件的 mtime
# —— 那是"这份源码的日期", 不是"tag 的日期", 所以 CI 应当显式传进来:
# —— 那是"这份源码的日期", 不是"tag 的日期", 所以 CI 应当显式传进来:
# podman build --build-arg VERSION=$(git describe --tags --abbrev=0) .
# podman build --build-arg VERSION=$(date -u +%Y.%m.%d) .
ARG VERSION=
@@ -91,31 +91,31 @@ RUN set -eux; \
if [ -n "$GIT_BRANCH" ]; then export LIGENT_BRANCH_OVERRIDE="$GIT_BRANCH"; fi; \
if [ -n "$BUILD_EPOCH" ]; then export SOURCE_DATE_EPOCH="$BUILD_EPOCH"; fi; \
\
# 静态目标. STATIC_CC=cc:同上, Alpine 的 cc 已经是 musl 目标. \
# 静态目标. STATIC_CC=cc: 同上, Alpine 的 cc 已经是 musl 目标. \
make static STATIC_CC=cc; \
\
# 自检:产物必须真的存在、真的是静态的、真的能跑. \
# 自检: 产物必须真的存在、真的是静态的、真的能跑. \
# 不检查的话, "构建成功"可能只是"链接器没报错", 而产物是个空壳 \
# (比如依赖没链全, 或者 -s 把符号表剥没了导致入口找不到). \
test -x /src/ligent-static; \
if ldd /src/ligent-static 2>&1 | grep -qv "not a dynamic executable\|statically linked\|Not a valid dynamic program"; then \
echo "产物不是静态链接的:" >&2; ldd /src/ligent-static >&2; exit 1; \
echo "产物不是静态链接的: " >&2; ldd /src/ligent-static >&2; exit 1; \
fi; \
V=$(/src/ligent-static --version); \
echo "容器内产物版本: $V"; \
# 版本号还是回退默认值 => -D 没生效, 构建是"看起来成功".
# 这里只在**没传 VERSION** 时警告:那种情况下回退是预期行为 (比如有人
# 这里只在**没传 VERSION** 时警告: 那种情况下回退是预期行为 (比如有人
# 直接 podman build 不带参数), 传了却没用上才是真问题.
if [ -n "$VERSION" ] && echo "$V" | grep -q '0.0.0-unknown'; then \
echo "错误:传了 VERSION=$VERSION 但产物仍报回退版本号" >&2; exit 1; \
echo "错误: 传了 VERSION=$VERSION 但产物仍报回退版本号" >&2; exit 1; \
fi
# ------------------------------------------------------------------ 运行阶段
# scratch 就够了:ligent-static 是完全静态的, 连 libc 都不需要.
# scratch 就够了: ligent-static 是完全静态的, 连 libc 都不需要.
# 没有任何攻击面可言 —— 镜像里只有一个二进制文件, 没有 shell、没有包管理器.
FROM scratch
# CA 证书是**唯一**需要的外部文件:TLS 握手要它.
# CA 证书是**唯一**需要的外部文件: TLS 握手要它.
# 注意 ligent 用的是编进 libcurl 的默认路径 /etc/ssl/certs/ca-certificates.crt
# (libcurl 库不读 CURL_CA_BUNDLE, 那是 curl 命令行工具的行为),
# 所以证书必须放在那个位置才行, 放别处不会被读到.
@@ -124,7 +124,7 @@ COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certifica
COPY --from=build /src/ligent-static /ligent
# 说明一下这个镜像是干什么的、怎么用.
# 用 LABEL 而不是放个 README 文件:scratch 里没有 cat, 放文件也读不了.
# 用 LABEL 而不是放个 README 文件: scratch 里没有 cat, 放文件也读不了.
LABEL org.opencontainers.image.title="ligent" \
org.opencontainers.image.description="纯 C 实现的 AI Agent (静态构建)" \
org.opencontainers.image.licenses="MIT" \