A container running its own avahi-daemon collides with the host's on :5353. Instead publish to the host avahi over its mounted D-Bus socket using avahi-tools (avahi-publish). Needs apparmor=unconfined (docker-default blocks the D-Bus publish). Documented host prereqs incl. allow-interfaces for multi-bridge hosts. Tested: publish reaches host avahi and registers the names; on hosts with many docker bridges avahi self-collides until restricted to the LAN interface. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
1.1 KiB
Bash
Executable File
33 lines
1.1 KiB
Bash
Executable File
#!/bin/sh
|
|
# Publish A records for the stack's service names on .local via the HOST's
|
|
# avahi-daemon (reached over its mounted D-Bus socket). One avahi-publish per
|
|
# name; if any drops the container exits so Docker restarts it.
|
|
set -eu
|
|
|
|
: "${BASE_DOMAIN:?BASE_DOMAIN unset}"
|
|
: "${HOST_LAN_IP:?HOST_LAN_IP unset}"
|
|
|
|
case "$BASE_DOMAIN" in
|
|
*.local) ;;
|
|
*) echo "WARN: mDNS resolves only .local — BASE_DOMAIN=$BASE_DOMAIN will NOT be discoverable via avahi. Set BASE_DOMAIN=*.local to use mDNS." >&2 ;;
|
|
esac
|
|
|
|
bus="${DBUS_SYSTEM_BUS_ADDRESS:-unix:path=/run/dbus/system_bus_socket}"
|
|
sock=${bus#unix:path=}
|
|
if [ ! -S "$sock" ]; then
|
|
echo "ERROR: host D-Bus socket '$sock' not found. Mount the host's" >&2
|
|
echo " /run/dbus/system_bus_socket and ensure avahi-daemon runs on the host." >&2
|
|
exit 1
|
|
fi
|
|
export DBUS_SYSTEM_BUS_ADDRESS="$bus"
|
|
|
|
pids=""
|
|
for n in "$BASE_DOMAIN" "auth.$BASE_DOMAIN" "packwiz.$BASE_DOMAIN" "mc.$BASE_DOMAIN"; do
|
|
echo "mDNS publish (host avahi): $n -> $HOST_LAN_IP"
|
|
avahi-publish -a "$n" "$HOST_LAN_IP" &
|
|
pids="$pids $!"
|
|
done
|
|
|
|
# shellcheck disable=SC2086
|
|
wait -n $pids 2>/dev/null || wait
|