您好,我正在尝试设置一个钩子,以便在 Discourse 重启或构建后重新启动时自动连接到我的 Docker 网络。这样我就可以在方便的时候使用管理员 Web 更新程序,但我想弄清楚如何最好地实现这一点。文档并没有真正说明我可以使用哪些钩子类型,而且查找诸如 after_post_boot 和 after_restart 之类的钩子也没有效果。这些钩子是否不再起作用?如果是,为什么?这是我的钩子代码。
钩子:
开始自定义网络钩子
after_restart:
exec:
cmd:
bash
“-c”
|\
如果容器尚未连接到自定义 Docker 网络,则将其连接
NETWORK_NAME=“proxy”
CONTAINER_NAME=$(hostname)
# 如果网络不存在,则创建它
if ! docker network inspect "$NETWORK_NAME" >/dev/null 2>&1; then
echo "正在创建 Docker 网络:$NETWORK_NAME"
docker network create "$NETWORK_NAME"
fi
# 将容器连接到网络(如果已连接则忽略)
echo "正在将 $CONTAINER_NAME 连接到 $NETWORK_NAME..."
docker network connect "$NETWORK_NAME" "$CONTAINER_NAME" 2>/dev/null || true
echo "网络连接完成。"
结束自定义网络钩子
Ethsim2
(Ethan )
2025 年11 月 8 日 22:54
2
app.yml 中实际上并没有固定的全局钩子类型列表。
钩子由 Pups 动态提供,你只能附加到包含在模板中存在的钩子上。
工作原理
当你看到类似这样的内容时:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
这是因为模板包含一个类似这样的步骤:
- hook: code
run:
- exec: ...
Pups 允许你在任何已定义的钩子点 之前或之后 附加命令。
所以,如果一个模板定义了 hook: code,你可以使用 before_code: 或 after_code:。
如果它定义了 hook: assets_precompile,你可以使用 before_assets_precompile: 或 after_assets_precompile: — 以此类推。
如果没有 hook: restart(例如),那么 after_restart: 就不会触发。
默认模板中已知的钩子
来自 Discourse Docker 默认附带的 templates/*.yml:
钩子名称
常见用法
兼容
code
插件克隆、自定义文件编辑等的主要设置阶段。
before_code: / after_code:
assets_precompile
Rails 资源编译后(例如,上传到 S3、清理)
after_assets_precompile:
web
在 Web 进程启动前的最后调整
before_web:
你经常会在插件安装示例中看到 after_code: 和 before_code: — 在大多数设置中,只需要这两个。
默认情况下不存在 的钩子
像 after_restart 或 after_post_boot 这样的名称与标准模板中的任何 hook: 都不匹配,因此 Pups 不知道在哪里附加它们。
除非你在自定义模板中添加一个匹配的 hook: restart 步骤,否则它们不会触发。
如何查找系统中所有可用的钩子
从你的 /var/discourse 文件夹运行:
grep -R "hook:" -n templates/ samples/
这将列出你当前包含的所有模板支持的每个钩子名称。
你找到的任何内容都可以在 hooks: 块内用作 before_<name>: 或 after_<name>:。
参考
Pups README (Discourse Docker 设置使用的配置管理工具)简要解释了这种行为:
“钩子是模板中的点,允许在标记为 hook: 的步骤之前或之后注入命令。”
实践
对于大多数自定义 shell 命令(如插件安装),请使用 after_code:。
对于需要在容器启动或重启时执行的操作,请使用小型启动脚本或 supervisord 任务,而不是发明新的钩子名称。
要添加你自己的钩子类型,请创建一个带有自定义 hook: something 条目的新模板,然后从 app.yml 中定位它。
总结:
只有实际出现在你的模板中的 hook: 条目中的钩子名称才存在。
在默认的 Discourse Docker 中,基本上就是 code、assets_precompile 和 web。
2 个赞
pfaffman
(Jay Pfaffman)
2025 年11 月 10 日 18:06
6
我认为钩子(hooks)帮不了你。你是说当你运行 web-updater 时,你的容器会从 docker 网络断开连接吗?
我敢肯定 web-updater 不会重启容器——它正是这样才能在不关闭 Discourse 的情况下运行的。
1 个赞
pfaffman:
web-updater 不会重启容器
这是正确的。
还应该注意的是,钩子是在容器内运行的,用于构建 discourse 镜像。那里没有任何东西在主机上运行,并且没有办法通过启动器函数来重新创建或销毁 docker 网络。
也许最好解释一下您在托管中遇到的问题,以便我们更好地理解您试图解决什么问题。
1 个赞
仅通过 CLI 更新,然后断开与 Docker 网络的连接,但这仅仅是因为容器会从该点重新启动。我将尝试 Web 更新程序,因为我还没有在此设置中尝试过。我曾认为这里也会发生同样的情况,但如果 Web 更新程序不关闭容器,那么确实没什么可担心的。我之所以说这一切,是因为我看到人们在此时运行 Web 更新程序时遇到问题。但我会尝试更新程序,看看效果如何。
Jonnyboy!iPhone 太棒了!