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

您好,我正在尝试设置一个钩子,以便在 Discourse 重启或构建后重新启动时自动连接到我的 Docker 网络。这样我就可以在方便的时候使用管理员 Web 更新程序,但我想弄清楚如何最好地实现这一点。文档并没有真正说明我可以使用哪些钩子类型,而且查找诸如 after_post_bootafter_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 "网络连接完成。"
      

结束自定义网络钩子

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 个赞

供参考,我认为 pups 仓库在这里:

@Ethsim2 我没有看到任何关于

的内容。

也许你在发布它之前应该看看 AI 的回复 :slightly_smiling_face:

来自 README:

通过定义钩子,在特定命令之前和之后执行命令。

1 个赞

怎么样?

Hooks let you execute custom commands before or after a specific build step, by defining before_<name>: or after_<name>: corresponding to a hook: <name> label in a template.

1 个赞

我认为钩子(hooks)帮不了你。你是说当你运行 web-updater 时,你的容器会从 docker 网络断开连接吗?

我敢肯定 web-updater 不会重启容器——它正是这样才能在不关闭 Discourse 的情况下运行的。

1 个赞

这是正确的。

还应该注意的是,钩子是在容器内运行的,用于构建 discourse 镜像。那里没有任何东西在主机上运行,并且没有办法通过启动器函数来重新创建或销毁 docker 网络。

也许最好解释一下您在托管中遇到的问题,以便我们更好地理解您试图解决什么问题。

1 个赞

仅通过 CLI 更新,然后断开与 Docker 网络的连接,但这仅仅是因为容器会从该点重新启动。我将尝试 Web 更新程序,因为我还没有在此设置中尝试过。我曾认为这里也会发生同样的情况,但如果 Web 更新程序不关闭容器,那么确实没什么可担心的。我之所以说这一切,是因为我看到人们在此时运行 Web 更新程序时遇到问题。但我会尝试更新程序,看看效果如何。

Jonnyboy!iPhone 太棒了!