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。