안녕하세요. Discourse가 재시작되거나 빌드 후 다시 시작될 때 자동으로 Docker 네트워크에 연결되도록 훅을 설정하려고 합니다. 이렇게 하면 가능할 때 관리자 웹 업데이트 도구를 사용할 수 있을 것 같습니다. 하지만 가장 좋은 방법을 찾느라 고민 중입니다. 문서에는 사용할 수 있는 모든 훅 유형이 명시되어 있지 않고, after_post_boot나 after_restart와 같은 훅을 검색해도 결과가 나오지 않습니다. 이 훅들이 더 이상 작동하지 않는 건가요? 그렇다면 그 이유는 무엇인가요? 제 훅 코드는 다음과 같습니다.
hooks:
begin custom network hook
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 "Creating Docker network: $NETWORK_NAME"
docker network create "$NETWORK_NAME"
fi
# 컨테이너를 네트워크에 연결 (이미 연결되어 있으면 무시)
echo "Connecting $CONTAINER_NAME to $NETWORK_NAME..."
docker network connect "$NETWORK_NAME" "$CONTAINER_NAME" 2>/dev/null || true
echo "Network connection complete."
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
웹 프로세스 시작 전 마지막 조정
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_<이름>: 또는 after_<이름>:으로 사용할 수 있습니다.
참고 자료
이 동작은 Pups README(Discourse의 Docker 설정에 사용되는 구성 관리 도구)에서 간략히 설명되어 있습니다:
“훅은 템플릿 내에서 hook:으로 라벨링된 단계의 앞이나 뒤에 명령을 주입할 수 있는 지점입니다.”
실제 적용
대부분의 사용자 정의 셸 명령(플러그인 설치 등)에는 after_code:를 사용하세요.
컨테이너 시작 또는 재시작 시 수행되어야 하는 작업에는 새로운 훅 이름을 발명하는 대신 작은 시작 스크립트나 supervisord 태스크를 사용하세요.
자체 훅 타입을 추가하려면 커스텀 hook: something 항목이 포함된 새 템플릿을 만들고, app.yml에서 이를 대상으로 지정하세요.
요약:
템플릿에서 실제로 hook: 항목으로 나타나는 훅 이름만 존재합니다.
표준 Discourse Docker에서는 기본적으로 code, assets_precompile, web입니다.
CLI를 통해서만 업데이트를 진행했는데, 그 과정에서 Docker 네트워크에서 연결이 끊기게 됩니다. 다만 이는 해당 시점에 컨테이너가 재시작되기 때문일 뿐입니다. 아직 이 설정에서 웹 업데이트기를 사용해 본 적이 없어서 이번에는 웹 업데이트기를 시도해 보겠습니다. 처음에는 여기에서도 동일한 현상이 발생할 거라고 생각했지만, 웹 업데이트기가 컨테이너를 종료하지 않는다면 정말 걱정할 일이 아닙니다. 제가 이 모든 내용을 언급한 이유는, 해당 시점에 웹 업데이트기를 실행했을 때 문제가 발생한다는 사례를 여러 번 봤기 때문입니다. 하지만 일단 업데이트기를 실행해 보고 결과를 확인해 보겠습니다.