app.yml 中可用的所有钩子是什么

app.yml 中实际上并没有固定的全局钩子类型列表。

钩子由 Pups 动态提供,你只能附加到包含在模板中存在的钩子上。


:magnifying_glass_tilted_left: 工作原理

当你看到类似这样的内容时:

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: 就不会触发。


:white_check_mark: 默认模板中已知的钩子

来自 Discourse Docker 默认附带的 templates/*.yml

钩子名称 常见用法 兼容
code 插件克隆、自定义文件编辑等的主要设置阶段。 before_code: / after_code:
assets_precompile Rails 资源编译后(例如,上传到 S3、清理) after_assets_precompile:
web 在 Web 进程启动前的最后调整 before_web:

你经常会在插件安装示例中看到 after_code:before_code: — 在大多数设置中,只需要这两个。


:cross_mark: 默认情况下不存在的钩子

after_restartafter_post_boot 这样的名称与标准模板中的任何 hook: 都不匹配,因此 Pups 不知道在哪里附加它们。
除非你在自定义模板中添加一个匹配的 hook: restart 步骤,否则它们不会触发。


:toolbox: 如何查找系统中所有可用的钩子

从你的 /var/discourse 文件夹运行:

grep -R "hook:" -n templates/ samples/

这将列出你当前包含的所有模板支持的每个钩子名称。
你找到的任何内容都可以在 hooks: 块内用作 before_<name>:after_<name>:


:blue_book: 参考

Pups README(Discourse Docker 设置使用的配置管理工具)简要解释了这种行为:

“钩子是模板中的点,允许在标记为 hook: 的步骤之前或之后注入命令。”


:puzzle_piece: 实践

  • 对于大多数自定义 shell 命令(如插件安装),请使用 after_code:
  • 对于需要在容器启动或重启时执行的操作,请使用小型启动脚本或 supervisord 任务,而不是发明新的钩子名称。
  • 要添加你自己的钩子类型,请创建一个带有自定义 hook: something 条目的新模板,然后从 app.yml 中定位它。

总结:
只有实际出现在你的模板中的 hook: 条目中的钩子名称才存在。
在默认的 Discourse Docker 中,基本上就是 codeassets_precompileweb

2 个赞