Какие типы хуков можно использовать в app.yml?

Привет! Пытаюсь настроить хук для автоматического подключения к моей Docker-сети при перезапуске или загрузке Discourse после сборки. Это нужно, чтобы я мог использовать веб-обновление администратора, когда это возможно, но я пытаюсь понять, какой способ лучше всего подходит. В документации не указаны все типы хуков, которые можно использовать, а поиск хуков, таких как after_post_boot и after_restart, ничего не дает. Не работают ли эти хуки больше, и если да, то почему? Вот мой код хуков.

hooks:

начало пользовательского сетевого хука

after_restart:

  • exec:
    cmd:
  • bash
  • “-c”
  • |

Подключить Discourse к пользовательской 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: Хуки, которые, как известно, существуют в стандартных шаблонах

Из стандартных templates/*.yml, поставляемых с Discourse Docker:

Имя хука Типичное использование Работает с
code Основной этап настройки для клонирования плагинов, редактирования пользовательских файлов и т. д. before_code: / after_code:
assets_precompile После компиляции ассетов Rails (например, загрузка в S3, очистка) after_assets_precompile:
web Для окончательных доработок перед запуском веб-процесса before_web:

Часто в примерах установки плагинов используются after_code: и before_code: — в большинстве случаев достаточно только их.


:cross_mark: Хуки, которых нет по умолчанию

Имена вроде after_restart или after_post_boot не соответствуют никакому hook: внутри стандартных шаблонов, поэтому Pups не знает, куда их прикрепить.
Они не сработают, если вы не добавите шаг с соответствующим hook: restart в пользовательский шаблон.


:toolbox: Как найти все доступные хуки в вашей системе

Из папки /var/discourse выполните:

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

Это выведет список всех имён хуков, поддерживаемых включёнными вами шаблонами.
Любое найденное имя можно использовать как before_<name>: или after_<name>: внутри блока hooks:.


:blue_book: Справочная информация

Это поведение кратко описано в README PUPS (инструмент управления конфигурацией, используемый настройкой Docker для Discourse):

«Хуки — это точки в шаблонах, которые позволяют вставлять команды до или после шага, помеченного как hook:


:puzzle_piece: На практике

  • Используйте after_code: для большинства пользовательских команд оболочки (например, установка плагинов).
  • Для действий, которые должны происходить при загрузке или перезапуске контейнера, используйте небольшой скрипт запуска или задачу supervisord, а не придумывайте новые имена хуков.
  • Чтобы добавить свой собственный тип хука, создайте новый шаблон с пользовательской записью hook: something, а затем обратитесь к нему из app.yml.

TL;DR:
Существуют только те имена хуков, которые фактически встречаются как записи hook: в ваших шаблонах.
В стандартном Discourse Docker это, по сути, code, assets_precompile и web.

Для справки, репозиторий Pups, я полагаю, находится здесь:

@Ethsim2 я не вижу ничего относительно

Возможно, вам стоит проверить ответ ИИ перед его публикацией :slightly_smiling_face:.

Из README:

Выполнять команды до и после определённой команды, определив хук.

Из репозитория GitHub:

Как насчёт этого?

Хуки позволяют выполнять пользовательские команды до или после конкретного шага сборки, определяя before_<имя>: или after_<имя>: в соответствии с меткой hook: <имя> в шаблоне.

Думаю, хуки вам не помогут. Вы говорите, что при запуске web-updater ваш контейнер отключается от сети Docker?

Я почти уверен, что web-updater не перезапускает контейнер — именно поэтому он может работать, не выключая Discourse.

Это верно.

Также стоит отметить, что хуки выполняются внутри контейнера для сборки образа Discourse. Ничего не запускается на хосте, и через функции launcher невозможно воссоздать или уничтожить сети Docker.

Возможно, было бы лучше объяснить, с какой проблемой вы столкнулись при размещении, чтобы мы лучше понимали, что именно вы пытаетесь решить.

Обновление возможно только через CLI, и это разрывает соединение с Docker-сетью, но это происходит лишь потому, что контейнер перезапускается с этого момента. Я попробую веб-обновление, так как еще не применял его в этой конфигурации. Я думал, что здесь проявится такое же поведение, но если веб-обновление не выключает контейнеры, то беспокоиться действительно не о чем. Причиной, по которой я всё это описал, стало то, что я видел, как у людей возникали проблемы при запуске веб-обновления в этот момент. Но я попробую обновить и посмотрю, как всё пройдет.

Джоннибой! Айфоны — это круто!

Я сделал эту тему скрытой и закрою её, установив таймер для удаления. В текущем виде она лишь запутывает и не полезна. @Jonathan_Candler, если вам всё ещё нужна помощь, пожалуйста, создайте новую тему в Support, чтобы объяснить проблему, которую вы пытаетесь решить.