如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Watchdog 提供外部世界与函数之间的接口。它为每个请求启动一个新进程,并使用 STDIO 进行通信。
上文所述:一个小型 Web 服务器或垫片,为每个传入的 HTTP 请求 fork 所需进程
上文所述:一个小型 Web 服务器或垫片,为每个传入的 HTTP 请求 fork 所需进程
每个函数都需要嵌入此二进制文件,并将其用作 ENTRYPOINT 或 CMD,实际上它是容器的 init 进程。一旦进程被 fork,Watchdog 会通过 stdin 传入 HTTP 请求,并通过 stdout 读取 HTTP 响应。这意味着您的进程无需了解任何 Web 或 HTTP 相关知识。
ENTRYPOINT、CMD、stdin、stdout
您是否希望对 HTTP 响应、“热函数”、持久连接池或内存中缓存机器学习模型有更多控制?那么请查看新 of-watchdog 的 http 模式。
通过 CLI 创建函数
创建函数最简单的方法是使用模板和 FaaS CLI。CLI 可让您无需了解 Docker 知识,只需用一种支持的编程语言编写处理程序文件即可。
使用 OpenFaaS 创建您的第一个无服务器 Python 函数 使用 OpenFaaS 创建您的第一个无服务器 Python 函数
阅读 FaaS CLI 教程 阅读 FaaS CLI 教程
打包函数
回显函数的 Dockerfile 示例:
FROM ghcr.io/openfaas/classic-watchdog:0.3.4 AS watchdog
FROM alpine:3.22.1
RUN mkdir -p /home/app
COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN chmod +x /usr/bin/fwatchdog
# 添加非 root 用户
RUN addgroup -S app && adduser app -S -G app
RUN chown app /home/app
WORKDIR /home/app
USER app
# 在此处填充示例 - 例如 "cat"、"sha512sum" 或 "node index.js"
ENV fprocess="cat"
# 设置为 true 可在函数日志中查看请求
ENV write_debug="false"
EXPOSE 8080
CMD ["fwatchdog"]
Watchdog 可通过环境变量进行配置。您必须始终指定 fprocess 变量。
| 选项 | 用法说明 |
|---|---|
| fprocess | 每次函数调用时要调用的进程(函数进程)。必须是 UNIX 二进制文件,通过 STDIN 接收输入并通过 STDOUT 输出 |
| cgi_headers | 请求中的 HTTP 头通过环境变量提供 - 如 Http_X_Served_By 等。详见:处理头信息部分。默认启用 |
| marshal_request | 不将原始 HTTP 正文重定向到 fprocess,而是先将其编组为 JSON。如果需要处理 HTTP 头且不想通过 cgi_headers 标志使用环境变量,请使用此选项 |
| content_type | 为所有响应强制指定特定的 Content-Type 响应 |
| write_timeout | 从函数写入响应正文的 HTTP 超时时间(秒) |
| read_timeout | 从客户端调用者读取有效负载的 HTTP 超时时间(秒) |
| healthcheck_interval | 容器编排器(如 kubelet)进行 HTTP 健康检查的间隔(秒)。用于优雅关闭 |
| suppress_lock | Watchdog 将尝试向 /tmp/ 写入锁文件以进行 swarm 健康检查 - 设置为 true 可禁用此行为 |
| exec_timeout | 为每个传入请求执行的进程的硬超时(秒)。如果设置为 t... |
fprocess、cgi_headers、Http_X_Served_By、marshal_request、cgi_headers、content_type、write_timeout、read_timeout、healthcheck_interval、suppress_lock、exec_timeout、write_debug、combine_output、stderr、max_inflight、jwt_auth、true、http://gateway.openfaas:8080、jwt_auth_debug、jwt_auth_local、true、http://127.0.0.1:8080
默认情况下,watchdog 会将函数的响应与客户端的“Content-Type”匹配。
application/json 的 JSON 请求,响应中将自动匹配该类型。text/plain 的 JSON 请求,响应中也将自动匹配该类型。要覆盖所有响应的 Content-Type,请设置 content_type 环境变量。
Watchdog 提供了外部世界与函数之间的接口。它为每个请求启动一个新进程,并使用 STDIO 进行通信。
上文所述:一个小型 Web 服务器或垫片,为每个传入的 HTTP 请求 fork 所需进程
每个函数都需要嵌入此二进制文件,并将其用作 ENTRYPOINT 或 CMD,实际上它是容器的 init 进程。一旦进程被 fork,watchdog 会通过 stdin 传递 HTTP 请求,并通过 stdout 读取 HTTP 响应。这意味着您的进程无需了解任何 Web 或 HTTP 相关知识。
您是否希望更好地控制 HTTP 响应、“热函数”、持久连接池或在内存中缓存机器学习模型?那么请查看新 https://github.com/openfaas-incubator/of-watchdog 的 http 模式。
通过 CLI 创建函数
创建函数最简单的方法是使用模板和 FaaS CLI。CLI 可以让您无需了解 Docker 知识,只需用一种支持的编程语言编写处理程序文件即可。
打包函数
echo 函数的 Dockerfile 示例:
FROM ghcr.io/openfaas/classic-watchdog:0.3.4 AS watchdog
FROM alpine:3.22.1
RUN mkdir -p /home/app
COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN chmod +x /usr/bin/fwatchdog
# Add non root user
RUN addgroup -S app && adduser app -S -G app
RUN chown app /home/app
WORKDIR /home/app
USER app
# Populate example here - i.e. "cat", "sha512sum" or "node index.js"
ENV fprocess="cat"
# Set to true to see request in function logs
ENV write_debug="false"
EXPOSE 8080
CMD ["fwatchdog"]
Watchdog 可通过环境变量进行配置。您必须始终指定 fprocess 变量。
| 选项 | 用途 |
|---|---|
fprocess | 每次函数调用时要调用的进程(函数进程)。必须是 UNIX 二进制文件,并通过 STDIN 接受输入,通过 STDOUT 输出 |
cgi_headers | 请求中的 HTTP 头通过环境变量提供,例如 Http_X_Served_By 等。详见:处理头信息 部分。默认启用 |
marshal_request | 不将原始 HTTP 正文重定向到 fprocess,而是先将其序列化为 JSON。如果需要处理 HTTP 头且不想通过 cgi_headers 标志使用环境变量,请使用此选项 |
content_type | 为所有响应强制设置特定的 Content-Type |
write_timeout | 函数写入响应正文的 HTTP 超时时间(秒) |
read_timeout | 从客户端调用者读取有效负载的 HTTP 超时时间(秒) |
healthcheck_interval | 容器编排器(如 kubelet)进行 HTTP 健康检查的间隔(秒)。用于优雅关闭 |
suppress_lock | Watchdog 会尝试向 /tmp/ 写入锁定文件以进行 swarm 健康检查 - 设置为 true 可禁用此行为 |
exec_timeout | 为每个传入请求执行的进程的硬超时时间(秒)。设为 0 则禁用 |
write_debug | 将所有输出、错误消息和附加信息写入日志。默认值为 false |
combine_output | 默认值为 true - 在函数响应中合并 stdout/stderr;设为 false 时,stderr 写入容器日志,stdout 用于函数响应 |
max_inflight | 限制最大并发请求数 |
jwt_auth | 仅适用于 OpenFaaS for Enterprises 客户。设为 true 时,watchdog 要求在 Authorization 头中传递 JWT token 作为 Bearer token。此 token 只能通过 OpenFaaS 网关使用 http://gateway.openfaas:8080 地址作为授权机构进行令牌交换获取 |
jwt_auth_debug | 打印 JWT 身份验证过程的调试消息(仅适用于 OpenFaaS for Enterprises) |
jwt_auth_local | 设为 true 时,watchdog 将尝试使用端口转发或运行在 http://127.0.0.1:8080 的本地网关验证 JWT token,而非通过集群内服务名称访问(仅适用于 OpenFaaS for Enterprises) |
| 名称 | 描述 | 类型 |
|---|---|---|
| http_requests_total | 请求总数 | Counter |
| http_request_duration_seconds | 请求持续时间 | Histogram |
| http_requests_in_flight | 并发请求数 | Gauge |
每个请求 fork 一个新进程具有进程隔离、可移植性和简单性等优势。任何进程都可以无需额外代码即可转换为函数。of-watchdog 及其“HTTP”模式是一种优化,可在所有请求之间维持单个进程。
新版本的 watchdog 正在 https://github.com/openfaas-incubator/of-watchdog 进行测试。
此次重写主要是为了持续维护的结构调整。它将成为现有 watchdog 的即插即用替代品,并提供二进制版本。
Watchdog 能够与健康检查配合以实现优雅关闭。
当 watchdog 进程中检测到 SIGTERM 信号时,Go 协程将删除 /tmp/.lock 文件,并将 HTTP 健康检查标记为不健康,返回 HTTP 503。然后代码将等待 write_timeout 中指定的持续时间。在此期间,容器编排器的健康检查必须运行并完成。
现在编排器会将此副本标记为不健康,并将其从有效 HTTP 端点池中移除。
现在我们将停止接受新连接,并等待 write_timeout 中定义的值,然后最终允许进程退出。
头信息和其他请求信息会以以下格式注入到环境变量中:
X-Forwarded-By 头会以 Http_X_Forwarded_By 的形式可用
Http_Method - GET/POST 等Http_Query - 查询字符串值Http_ContentLength 和 Http_Content_Length - 提供看门狗接收到的传入 HTTP 请求的总内容长度,见下方说明Http_Transfer_Encoding - 仅在提供时设置,若设置为 chunked,则 Content-Length 将为 -1,表示不适用此行为由
cgi_headers环境变量启用,该变量默认启用(true)。
以下是一个带有附加头和查询字符串的 POST 请求示例。
$ cgi_headers=true fprocess=env ./watchdog &
2017/06/23 17:02:58 Writing lock-file to: /tmp/.lock
$ curl "localhost:8080?q=serverless&page=1" -X POST -H X-Forwarded-By:http://my.vpn.com
如果在 Linux 系统上将 fprocess 设置为 env,你会看到以下内容:
Http_User_Agent=curl/7.43.0
Http_Accept=*/*
Http_X_Forwarded_By=http://my.vpn.com
Http_Method=POST
Http_Query=q=serverless&page=1
你也可以使用 GET 方法:
$ curl "localhost:8080?action=quote&qty=1&productId=105"
看门狗的输出将是:
Http_User_Agent=curl/7.43.0
Http_Accept=*/*
Http_Method=GET
Http_Query=action=quote&qty=1&productId=105
现在你可以在应用程序中使用 HTTP 状态来做出决策。
看门狗支持的 HTTP 方法如下:
带请求体:
不带请求体:
API Gateway 当前支持函数的 POST 路由。
默认情况下,看门狗会将函数的响应与客户端的 "Content-Type" 匹配。
application/json 的 JSON 请求,响应中会自动匹配此类型。text/plain 的 JSON 请求,响应中也会自动匹配此类型要覆盖所有响应的 Content-Type,请设置 content_type 环境变量。
来自真实用户的反馈,见证轩辕镜像的优质服务