Hallo Zusammen!
Ich musste eine Weile probieren, bis ich einen Slave ioBroker-Container unter Docker auf meinem MacStudio als Docker-Host in mein ioBroker Setup einbinden konnte. Daher habe ich hier ein paar Anmerkungen aufgeschrieben, falls das noch einmal jemand versucht.
Zunächst einmal ist wichtig, daß man den Slave im Container NICHT mittels "iobroker multihost connect" in den existierenden Master/Slave-Verbund einhängen kann, denn 'iobroker multihost connect' findet den Master nicht!
Die Konfiguration als Slave muss unbedingt über Environment-Variablen zum Startzeitpunkt des Containers erfolgen. Gleiches gilt, wenn der Container seine States und Objects aus einer bestehenden Redis-(Sentinel) DB oder über einen anderen der möglichen Datenbanktypen erhalten soll. Auch hier funktioniert "iobroker setup custom" zunächst nicht.
Ich habe mir eine Datei mit den Environment Settings auf meinem Mac in einem lokalen Verzeichnis angelegt. Meine Konfiguration ist für ein Redis Sentinel mit 3 Nodes ausgelegt. Wer nur Redis oder etwas anderes nutzt, muss das entsprechend auf (s)eine IP und den Port 6379 usw. anpassen.
ioBroker-env/vars.env:
IOB_MULTIHOST=slave
IOB_OBJECTSDB_TYPE=redis
IOB_OBJECTSDB_HOST=192.168.178.xx1,192.168.178.xx2,192.168.178.xx3
IOB_OBJECTSDB_PORT=26379
IOB_STATESDB_TYPE=redis
IOB_STATESDB_HOST=192.168.178.xx1,192.168.178.xx2,192.168.178.xx3
IOB_STATESDB_PORT=26379
Um besser an den ioBroker Log-Output des Containers zu kommen, habe ich das Verzeichnis /opt/iobroker mittels '-v' noch auf ein lokales Verzeichnis auf dem Mac-Host gemounted. Achtung: das Verzeichnis muss vor dem ersten Start des Containers unbedingt leer sein, sonst glaubt ioBroker, es handelt sich um eine bereits fertige Installation und kommt aus dem Tritt mit der initialen Installation!
Zusätzlich habe ich einige wichtige Ports expilzit aus dem Container nach aussen geführt. 'docker --net=host' ist unter MacOS nämlich mit Vorsicht zu genießen, denn es exponiert nur alle Ports auf der IP der Docker-Mac internen Virtualisierungsschicht.
Mein Docker-Aufruf lautet dann so (kann man natürlich auch noch in ein Dockerfile oder einen Compose-Aufruf packen), wobei ich halt den Container als Slave mit Hostnamen iobroker8 verwende. Der Hostname wird ja über den Parameter '-h' im Docker-Aufruf festgelegt, müsst ihr also nach Bedarf anpassen:
docker container create --restart always --name iobroker8 --env-file ioBroker-env/vars.env -v /PATH_TO_LOCAL_DIR/ioBroker:/opt/iobroker -p 1880:1880 -p 2001:2001 -p 8081:8081 -p 8082:8082 -p 8088:8088 -p 8284:8284 -p 9000:9000 -p 9001:9001 -h iobroker8 buanet/iobroker
So weit, so gut. Startet, updated sich, konfiguriert sich - Host wird im ioBroker-Verbund aber nicht als aktiv gezeigt. Und kommt dann in eine Restart-Loop wegen 'error: host.iobroker8 No connection to databases possible, restart'. 'iobroker status' meldet ebenfalls 'no connection to databases possible'.
Abhilfe ist hier dann doch der Aufruf von 'iobroker setup custom' in einer Shell des Containers. Anscheinend kennt ioBroker die IPs eines Redis oder eines Sentinels zwar aus der Environment-Konfiguration, muss aber trotzdem noch einmal auf dem neuen Slave 'iobroker setup custom' durchlaufen, ehe er den Sentinel Cluster findet und dann dem ioBroker-Verbund als neuer Slave beitritt. Vielleicht ein Bug?
Vielleicht hilft es ja dem ein oder anderen hier weiter!
Viele Grüße
Dirk